Здравствуйте, 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>>
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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=. А уж если мы его всё равно напишем, то смысл тогда использовать кривой