Информация об изменениях

Сообщение Re: operator* для enum class от 21.09.2021 9:29

Изменено 22.09.2021 20:14 watchmaker

Re: operator* для enum class
Здравствуйте, B0FEE664, Вы писали:

BFE>Надоело писать static_cast'ы и функции для конвертации enum ---> int.


BFE>Слишком неожиданно?

BFE>Кто-нибудь так делал?

Достаточно неожиданно встретить перегрузку operator*, когда все для этих целей перегружают унарный operator+
Унарный плюс ведь уже делает integral promotion у других типов — удивления меньше.


BFE>unsigned int operator* (TestE x)

BFE>{
BFE> return TestE::a == x ? 0 : 1;
BFE>};
В эту сторону проще сделать (возможно в шаблоне для всех enum)

return static_cast<std::underlying_type_t<TestE>>(x);

и навсегда забыть об ручном выписывании значений.
Re: operator* для enum class
Здравствуйте, B0FEE664, Вы писали:

BFE>Надоело писать static_cast'ы и функции для конвертации enum ---> int.


BFE>Слишком неожиданно?

BFE>Кто-нибудь так делал?

Достаточно неожиданно встретить перегрузку operator*, когда все для этих целей перегружают унарный operator+
Унарный плюс ведь уже делает integral promotion у других типов — удивления меньше.

И для unscoped перечислений его давно так используют:
enum Enum {
    Foo
};

void fn(Enum);
void fn(int);

void test() {
    fn(Foo);   // вызов перегрузки  void fn(Enum)
    fn(+Foo);  // вызов перегрузки  void fn(int)
}


BFE>unsigned int operator* (TestE x)

BFE>{
BFE> return TestE::a == x ? 0 : 1;
BFE>};
В эту сторону проще сделать (возможно в шаблоне для всех enum)

return static_cast<std::underlying_type_t<TestE>>(x);

и навсегда забыть об ручном выписывании значений.