![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Добрый день!
Можно ли как-нить автоматизировать создание опкратора == для своих структур? Поясню: сегодня я создал структуру A. Завтра мне потребовалось использовать её в std-алгоритмах (например find). Нужно написать operator==. Послезавтра я создал структуру B, нужно не забыть сделать ей operator==. Затем я добавил в A поле. Нужно не забыть добавить его в A::operator==. И т.д. и т.п. Как бы это автоматизировать ? Может это можно как-то сделать наподобии rel_ops ? P.S. Ведь генерит же компилятор оператор присвоения по-умолчанию… Другими словами, если у компилятора есть такое (псевдокод)
почему же тогда нет такого
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
А если добавленное поле не требуется учитывать в сравнении? Полного решения проблемы, в данном случае, нет, как и в случае с "автоматически создаваемым" оператором присваивания: в нём тоже может потребоваться нетривиальная логика, и компиляторный вариант operator = становится непригодным. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
можно так, но думаю недостатки такого оператора сравнения объяснять не надо? Добавлено через 2 минуты и 30 секунд а это уже reflection, которого в C++ к сожалению нет. Это сообщение отредактировал(а) azesmcar - 17.6.2011, 09:41 |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
вот именно - "компиляторный вариант". жаль, что такого варианта нет для оператора ==. Ессно, если мне понадобится другое поведение, чем сравнение всех полей, я могу спокойно переопределить его. Так же как и с оператором присвоения. Но... к сожалению, компилятор не делает оператора == по-умолчанию... :пичалька я имел в виду, что это не в Си++, а в компиляторе такой код. Причём псевдо...
не надо :( не подходит. по той тем самым причинам... тогда уж так
Кстати, по ходу возник ещё вопрос: можно ли как-нить сделать unusing namespace ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
вопрос: Как это сделать ? Ответ типа "абсолютно точно, гарантировано, 100% - никак. забудь об этом и пиши всегда ручками" - вполне нормальный ответ. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Запихать его в анонимный namespace? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
EnergoHokum, если не сложно, покажи как, а то разбираться времени нет. Спасибо.
Для вышеприведённого примера:
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
Это сообщение отредактировал(а) triclosan - 17.6.2011, 15:52 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
на каком основании? Это сообщение отредактировал(а) azesmcar - 17.6.2011, 16:07 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Лучше такой код не использовать ни в каком виде. Так как есть один небольшой "подводный камень": Например для такой структуры struct A { char _m1; int _m2 }; между _m1 и _m2, будут расположены байты выравнивания, незначащие, и заполненные мусором. но memcmp будет сравнивать их наравне с фактическими членами. Две одинаковые стркутуры (со всеми одинаковыми мемберами) - будут не равны. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
volatile,
хотя, всё равно спасибо за этот нюанс... ok, закрываю, но если у кого-нить чо-нить возникнет - велкам ! -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |