| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Автоматическое создание operator== |
| Автор: borisbn 17.6.2011, 08:26 | ||||
| Добрый день! Можно ли как-нить автоматизировать создание опкратора == для своих структур? Поясню: сегодня я создал структуру A. Завтра мне потребовалось использовать её в std-алгоритмах (например find). Нужно написать operator==. Послезавтра я создал структуру B, нужно не забыть сделать ей operator==. Затем я добавил в A поле. Нужно не забыть добавить его в A::operator==. И т.д. и т.п. Как бы это автоматизировать ? Может это можно как-то сделать наподобии rel_ops ? P.S. Ведь генерит же компилятор оператор присвоения по-умолчанию… Другими словами, если у компилятора есть такое (псевдокод)
почему же тогда нет такого
|
| Автор: EnergoHokum 17.6.2011, 09:39 | ||
А если добавленное поле не требуется учитывать в сравнении? Полного решения проблемы, в данном случае, нет, как и в случае с "автоматически создаваемым" оператором присваивания: в нём тоже может потребоваться нетривиальная логика, и компиляторный вариант operator = становится непригодным. |
| Автор: azesmcar 17.6.2011, 09:40 | ||
можно так, но думаю недостатки такого оператора сравнения объяснять не надо? Добавлено через 2 минуты и 30 секунд а это уже reflection, которого в C++ к сожалению нет. |
| Автор: azesmcar 17.6.2011, 11:05 | ||
Ну...нету такого, в чем тогда вопрос мне не совсем понятно. |
| Автор: borisbn 17.6.2011, 11:10 |
вопрос: Как это сделать ? Ответ типа "абсолютно точно, гарантировано, 100% - никак. забудь об этом и пиши всегда ручками" - вполне нормальный ответ. |
| Автор: azesmcar 17.6.2011, 12:06 |
| Автор: EnergoHokum 17.6.2011, 15:27 | ||
Запихать его в анонимный namespace? |
| Автор: borisbn 17.6.2011, 15:30 | ||
| EnergoHokum, если не сложно, покажи как, а то разбираться времени нет. Спасибо. Для вышеприведённого примера:
|
| Автор: triclosan 17.6.2011, 15:51 | ||
|
| Автор: azesmcar 17.6.2011, 15:57 | ||
на каком основании? |
| Автор: volatile 18.6.2011, 00:14 | ||
Лучше такой код не использовать ни в каком виде. Так как есть один небольшой "подводный камень": Например для такой структуры struct A { char _m1; int _m2 }; между _m1 и _m2, будут расположены байты выравнивания, незначащие, и заполненные мусором. но memcmp будет сравнивать их наравне с фактическими членами. Две одинаковые стркутуры (со всеми одинаковыми мемберами) - будут не равны. |
| Автор: borisbn 18.6.2011, 15:15 |
| volatile, хотя, всё равно спасибо за этот нюанс... ok, закрываю, но если у кого-нить чо-нить возникнет - велкам ! |