Унарным + узнать underlying от enum
От: Sm0ke Россия ksi
Дата: 04.07.23 16:38
Оценка: 8 (2)
Александреску предложил перегрузить унарный префиксный оператор + для всех енумов для получения их underlying value

https://twitter.com/incomputable/status/1676216330402381826?s=20

#include <cassert>
#include <type_traits>

template <typename Enum>
auto operator+(Enum e) -> std::enable_if_t<std::is_enum_v<Enum>, std::underlying_type_t<Enum>>
{
    return static_cast<std::underlying_type_t<Enum>>(e);
}

enum class MyEnum : unsigned int { Value1 = 1, Value2 = 2, Value3 = 3 };

int main() {
    auto e = MyEnum::Value2;
    auto val = +e;
    static_assert(std::is_same_v<decltype(val), unsigned int>);
    assert(val == 2);
}


я Заменил enable_if на концепт:

#include <cassert>
#include <type_traits>

template <typename T>
concept enum_type = std::is_enum_v<T>;

template <enum_type Enum>
constexpr auto operator + (Enum e) -> std::underlying_type_t<Enum> {
    return static_cast< std::underlying_type_t<Enum> >(e);
}

enum class MyEnum : unsigned int { Value1 = 1, Value2 = 2, Value3 = 3 };

int main() {
    auto e = MyEnum::Value2;
    auto val = +e;
    static_assert(std::is_same_v<decltype(val), unsigned int>);
    assert(val == 2);
}


Что думаете? Писать меньше текста ведь удобнее ...
Отредактировано 04.07.2023 16:40 Sm0ke . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.