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

Сообщение Унарным + узнать underlying от enum от 04.07.2023 16:38

Изменено 04.07.2023 16:40 Sm0ke

Унарным + узнать underlying от enum
Александреску предложил перегрузить унарный префиксный оператор + для всех енумов, чтобы получить его underlying value



#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);
}


Что думаете? Писать меньше текста ведь удобнее ...
Унарным + узнать underlying от enum
Александреску предложил перегрузить унарный префиксный оператор + для всех енумов для получения их underlying value



#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);
}


Что думаете? Писать меньше текста ведь удобнее ...