当使用 enum class 时,它具有更强的类型安全性和隔离性,因此需要显式转换才能访问其底层整数值。
std::underlying_type_t 是一个类型别名,它返回枚举类型的底层类型。
to_underlying 函数提供了一种方便的方式来执行这种转换,特别是在需要频繁进行此类转换的情况下。
#include <type_traits>
#include <utility>
#include <cstdint>
#include <iostream>
template<class T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
constexpr std::underlying_type_t<T> to_underlying(T t) noexcept
{
return static_cast<std::underlying_type_t<T>>(t);
}
template<class R, class T, std::enable_if_t<std::is_enum_v<R>, int> = 0,
std::enable_if_t<!std::is_enum_v<T>, int> = 0>
constexpr R to_underlying(R& val, T t) noexcept
{
using UnderlyingType = std::underlying_type_t<R>;
UnderlyingType underlyingColor = static_cast<UnderlyingType>(t);
val = static_cast<R>(underlyingColor);
return val;
}
template<class T, std::enable_if_t<!std::is_enum_v<T>, int> = 0>
constexpr T to_underlying(T t) noexcept
{
return t;
}
void test() {
enum class E : std::uint8_t { A = 0, B, C };
int x = to_underlying(E::B);
int x1 = to_underlying(E::A);
std::cout << x << "," << x1 << std::endl;
}
输出: 1,0