Здравствуйте, rg45, Вы писали:
M>>Я пока не делал operator bool, мало ли что вылезет.
R>А как ты собираешься сделать оператор bool для перечисления? Его ведь можно сделать только как функцию-член.
А вот это видимо то, почему я сразу так не сделал, и просто забыл
А есть какие-нибудь варианты?
M>>Но, в условных операторах уже устал писать ==0 / !=0.
R>Если условный оператор понимает конструкции if(x==0) и if(!=0), значит enum обычный, unscoped, а значит, услоный оператор так же точно способен понять и конструкции if(x) и if(!x) и никаких операторов для этого определять не нужно.
enum — scoped
#define MAKE_ENUM_FLAGS(TEnum) \
inline constexpr bool operator==(TEnum a, std::underlying_type<TEnum>::type b) \
{ \
using TUnder = typename std::underlying_type<TEnum>::type; \
return static_cast<TUnder>(a) == b; \
} \
inline constexpr bool operator==(std::underlying_type<TEnum>::type a, TEnum b) \
{ \
using TUnder = typename std::underlying_type<TEnum>::type; \
return a == static_cast<TUnder>(b); \
} \
inline constexpr bool operator!=(TEnum a, std::underlying_type<TEnum>::type b) \
{ \
using TUnder = typename std::underlying_type<TEnum>::type; \
return static_cast<TUnder>(a) != b; \
} \
inline constexpr bool operator!=(std::underlying_type<TEnum>::type a, TEnum b) \
{ \
using TUnder = typename std::underlying_type<TEnum>::type; \
return a != static_cast<TUnder>(b); \
} \
M>>На какие грабли можно нарваться?
R>Да грабли могут быть самые разноообразные. Вот из недавнего, например. Был у нас чудо-юдо-супер-говно класс, написанный хрен знает когда для якобы эффективной работы со всякими строками. Объекты этого класса часто использовались в качестве ключей ассоциативных контейнеров. Для этих целей в этом классе был определены операторы сравнения (обычные). И вот, настало время переходить на C++20. Ну, попыхтели-попыхтели и перешли. И, как потом выяснилось, все ассоциативные контейнеры в новой реализации стандартной библиотеке используют уже новый spaceship оператор <=>. Такого оператора в этом классе, конечно же, не было. Зато в этом классе были определены операторы неявного преобразования к char* и const char*, для которых (внезапно) оператор <=> определен. Ну вот эти операторы преобразования и подхватились. И пошло сравнение голых указателей, вместо сравнения содержимого строк. И ведь все успешно откомпилировалось, а ошибку ловили уже в рантайме. А, как известно, чем дурнее ошибка, тем дольше ты ее будешь ловить. И это лишь единичный пример, а вообще, это очень западлистая штука, эти неявные преобразования. И никакой фантазии не хватит, чтоб представить, во что это счастье может вылиться.
Ну вот я подобного и опасаюсь