Re[7]: [Trick] безопасный оператор присваивания без swap()
От: Кодт Россия  
Дата: 06.01.07 15:37
Оценка:
Здравствуйте, remark, Вы писали:

R>Ну да, можно либо указать seal (либо даже форсировать, тогда не придирёшься)

R>Либо сделать проверку для полиморфных классов, типа такого:
R>// Проверяем, что не порушили динамический тип объекта
R>ASSERT(*reinterpret_cast<int*>(this) == *reinterpret_cast<int*>(buf));

Ну только не так! Расположение (да и вообще наличие) vfptr в теле объекта — очень изменчиво. А если это POD-структура, чьё первое поле — как раз int?

Правильнее — сравнивать typeid'ы.
ASSERT(typeid(dst)==typeid(src));

И более того, по факту неравенства можно выполнять обычное присваивание без фокусов.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[8]: [Trick] безопасный оператор присваивания без swap()
От: remark Россия http://www.1024cores.net/
Дата: 06.01.07 16:07
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, remark, Вы писали:


R>>Ну да, можно либо указать seal (либо даже форсировать, тогда не придирёшься)

R>>Либо сделать проверку для полиморфных классов, типа такого:
К>
R>>// Проверяем, что не порушили динамический тип объекта
R>>ASSERT(*reinterpret_cast<int*>(this) == *reinterpret_cast<int*>(buf));
К>

К>Ну только не так! Расположение (да и вообще наличие) vfptr в теле объекта — очень изменчиво. А если это POD-структура, чьё первое поле — как раз int?

Речь же идёт о создании некого класса, у которого мы реализуем operator= таким хитрым способом.
Если это класс с виртуальными функциями и предполагает наследование, то имхо можно сделать как я написал.
Т.е. всё это делается в комплексе.
(правда вопрос по поводу множественного наследования... может там что будет не так)


К>Правильнее — сравнивать typeid'ы.

К>
К>ASSERT(typeid(dst)==typeid(src));
К>

К>И более того, по факту неравенства можно выполнять обычное присваивание без фокусов.


Ну собственно фишка вроде изначально и была в том, что нам лень делать нормальный swap или писать "хороший" operator=. А уж если мы его всё равно напишем, то смысл тогда использовать кривой


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.