Сообщение 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)
и навсегда забыть об ручном выписывании значений.
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 перечислений его давно так используют:
BFE>unsigned int operator* (TestE x)
BFE>{
BFE> return TestE::a == x ? 0 : 1;
BFE>};
В эту сторону проще сделать (возможно в шаблоне для всех enum)
и навсегда забыть об ручном выписывании значений.
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);
и навсегда забыть об ручном выписывании значений.