Неоднозначная перегрузка
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Доброго времени суток
Пусть имеется класс A, для которого перегружен оператор +, конструктор A(int) и оператор приведения к bool (для использования в конструкциях типа if( Aobject ) {..}).
При использовании класса появляется проблема. В конструкциях типа Apbject + 5 появляется неоднозначность: можно привести Aobject к bool и сложить два int'a, а можно привести 5 к A и сложить два объекта класса A (благо оператор + перегружен). Как грамотно избежать такой неоднозначности?
Проблема пока имеет теоретический интерес или уже практический? Если практический — код в студию!
Интерес практический. Делаю класс для реализации длинных беззнаковых чисел (до 2^128):
Файл ulll.h:
Ну и файл ulll.cpp, соответственно:
Сама неоднозначность возникает в строках:
porshe, запретить неявное преобразование
bool
кint
невозможно.Поэтому пути два:
ull::operator bool() const
,На мой вкус проще первый вариант.
Ну, этот вариант я уже рассматривал. Что же делать с
if( object )
?if( object != 0 ) ...
Как то это... непрофессионально, не тръу, что-ли...
Кстати говоря, если твой объект представляет собой числовую величину, то запись
if ( object != 0 )
как-то более уместна, чемif( object )
: «если число не равно нулю, то...» против «если число, то...».Ну ладно, пойду по первому пути. Спасибо.
porshe, для этого, начиная с C++11, имеется explicit operator bool:
Действительно, в стандарте п.7.1.2 есть
А в хелпе к MS VC++ написано только про конструкторы ((
Несмотря на это, компилятор от MS таки поддерживает спецификатор explicit для функций приведения типа для классов.
А ведь у меня по началу была мысль про explicit. Надо было в стандарт смотреть.