Сообщение Re: Унарным + узнать underlying от enum от 04.07.2023 21:04
Изменено 04.07.2023 21:19 serg_joker
Re: Унарным + узнать underlying от enum
Здравствуйте, Sm0ke, Вы писали:
S>Александреску предложил перегрузить унарный префиксный оператор + для всех енумов для получения их underlying value
Я тоже делаю перегрузку унарного плюса, но перегружаю только для is_scoped_enum (который С++23, но регко реализуем через is_enum<T> + !convertible_to<T,underlying_type<T>>).
Для non-scoped enum унарный плюс и так работает за счёт интегрального продвижения.
Разница в типе: встроенный унарный плюс даёт int, тогда как самописный может давать честный underlying type.
С одной стороны, хотелось бы иметь одинаковое поведение для scoped и non-scoped enums (а именно underlying_type), с другой — не хочется повлиять на существующий код (например, foo(+non_coped_enum_val) вызовет разные перегрузки в зависимости от того, видно ли в точке вызова определение operator+(T) -> underlying_type<T>).
Я понимаю, что вероятность нарваться на связанные с этим проблемы невелика, но и больших преимуществ от приведения non-scoped enum именно к underlying, а не int тоже нет, а там, где есть, лучше явно позвать to_underlying. Так что я выбираю безопасность (в плане невлияния на существующий код).
S>Александреску предложил перегрузить унарный префиксный оператор + для всех енумов для получения их underlying value
Я тоже делаю перегрузку унарного плюса, но перегружаю только для is_scoped_enum (который С++23, но регко реализуем через is_enum<T> + !convertible_to<T,underlying_type<T>>).
Для non-scoped enum унарный плюс и так работает за счёт интегрального продвижения.
Разница в типе: встроенный унарный плюс даёт int, тогда как самописный может давать честный underlying type.
С одной стороны, хотелось бы иметь одинаковое поведение для scoped и non-scoped enums (а именно underlying_type), с другой — не хочется повлиять на существующий код (например, foo(+non_coped_enum_val) вызовет разные перегрузки в зависимости от того, видно ли в точке вызова определение operator+(T) -> underlying_type<T>).
Я понимаю, что вероятность нарваться на связанные с этим проблемы невелика, но и больших преимуществ от приведения non-scoped enum именно к underlying, а не int тоже нет, а там, где есть, лучше явно позвать to_underlying. Так что я выбираю безопасность (в плане невлияния на существующий код).
Re: Унарным + узнать underlying от enum
Здравствуйте, Sm0ke, Вы писали:
S>Александреску предложил перегрузить унарный префиксный оператор + для всех енумов для получения их underlying value
Я тоже делаю перегрузку унарного плюса, но перегружаю только для is_scoped_enum (который С++23, но легко реализуем через is_enum<T> + !convertible_to<T,underlying_type<T>>).
Для non-scoped enum унарный плюс и так работает за счёт интегрального продвижения.
Разница в типе: встроенный унарный плюс даёт int, тогда как самописный может давать честный underlying type.
С одной стороны, хотелось бы иметь одинаковое поведение для scoped и non-scoped enums (а именно underlying_type), с другой — не хочется повлиять на существующий код (например, foo(+non_coped_enum_val) вызовет разные перегрузки в зависимости от того, видно ли в точке вызова определение operator+(T) -> underlying_type<T>).
Я понимаю, что вероятность нарваться на связанные с этим проблемы невелика, но и больших преимуществ от приведения non-scoped enum именно к underlying, а не int тоже нет, а там, где есть, лучше явно позвать to_underlying. Так что я выбираю безопасность (в плане невлияния на существующий код).
S>Александреску предложил перегрузить унарный префиксный оператор + для всех енумов для получения их underlying value
Я тоже делаю перегрузку унарного плюса, но перегружаю только для is_scoped_enum (который С++23, но легко реализуем через is_enum<T> + !convertible_to<T,underlying_type<T>>).
Для non-scoped enum унарный плюс и так работает за счёт интегрального продвижения.
Разница в типе: встроенный унарный плюс даёт int, тогда как самописный может давать честный underlying type.
С одной стороны, хотелось бы иметь одинаковое поведение для scoped и non-scoped enums (а именно underlying_type), с другой — не хочется повлиять на существующий код (например, foo(+non_coped_enum_val) вызовет разные перегрузки в зависимости от того, видно ли в точке вызова определение operator+(T) -> underlying_type<T>).
Я понимаю, что вероятность нарваться на связанные с этим проблемы невелика, но и больших преимуществ от приведения non-scoped enum именно к underlying, а не int тоже нет, а там, где есть, лучше явно позвать to_underlying. Так что я выбираю безопасность (в плане невлияния на существующий код).