Александреску предложил перегрузить унарный префиксный оператор + для всех енумов для получения их 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);
}
Что думаете? Писать меньше текста ведь удобнее ...