一个枚举类可以转换为基础types?

有没有办法将enum class字段转换为基础types? 我认为这是自动的,但显然不是。

 enum class my_fields : unsigned { field = 1 }; unsigned a = my_fields::field; 

海湾合作委员会拒绝了这项任务。 error: cannot convert 'my_fields' to 'unsigned int' in assignment

我想你可以使用std :: underlying_type来知道底层的types,然后使用cast:

 #include <type_traits> //for std::underlying_type typedef std::underlying_type<my_fields>::type utype; utype a = static_cast<utype>(my_fields::field); 

有了这个,你不必假定基础types,或者你不必在enum class的定义中提到它,比如enum class my_fields : int { .... }左右。

你甚至可以写一个通用的转换函数,该函数应该能够将任何 enum class转换为它的基本整型

 template<typename E> constexpr auto to_integral(E e) -> typename std::underlying_type<E>::type { return static_cast<typename std::underlying_type<E>::type>(e); } 

然后使用它:

 auto value = to_integral(my_fields::field); auto redValue = to_integral(Color::Red);//where Color is an enum class! 

由于函数被声明为constexpr ,所以你可以在需要常量expression式的地方使用它:

 int a[to_integral(my_fields::field)]; //declaring an array std::array<int, to_integral(my_fields::field)> b; //better! 

希望有所帮助。

你不能隐式转换它,但是一个明确的转换是可能的:

 enum class my_fields : unsigned { field = 1 }; // ... unsigned x = my_fields::field; // ERROR! unsigned x = static_cast<unsigned>(my_fields::field); // OK 

另外请注意,分号应该在枚举定义中的闭合大括号之后 ,而不是之前。

当找不到正确的序列化枚举值时,我发现下面的函数underlying_cast很有用。

 namespace util { namespace detail { template <typename E> using UnderlyingType = typename std::underlying_type<E>::type; template <typename E> using EnumTypesOnly = typename std::enable_if<std::is_enum<E>::value, E>::type; } // namespace util.detail template <typename E, typename = detail::EnumTypesOnly<E>> constexpr detail::UnderlyingType<E> underlying_cast(E e) { return static_cast<detail::UnderlyingType<E>>(e); } } // namespace util enum SomeEnum : uint16_t { A, B }; void write(SomeEnum /*e*/) { std::cout << "SomeEnum!\n"; } void write(uint16_t /*v*/) { std::cout << "uint16_t!\n"; } int main(int argc, char* argv[]) { SomeEnum e = B; write(util::underlying_cast(e)); return 0; }