枚举类可以转换为基础类型吗?

新手上路,请多包涵

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

 enum class my_fields : unsigned { field = 1 };

unsigned a = my_fields::field;

GCC 拒绝了该分配。 error: cannot convert 'my_fields' to 'unsigned int' in assignment

原文由 edA-qa mort-ora-y 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 630
2 个回答

我认为您可以使用 std::underlying_type 来了解基础类型,然后使用强制转换:

 #include <type_traits> //for std::underlying_type

typedef std::underlying_type<my_fields>::type utype;

utype a = static_cast<utype>(my_fields::field);

有了这个,您不必 假设 基础类型,或者您不必在 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 ,因此您可以在需要常量表达式的地方使用它:

 int a[to_integral(my_fields::field)]; //declaring an array

std::array<int, to_integral(my_fields::field)> b; //better!

原文由 Nawaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 C++23,您最终将获得一个库函数:

std::to_underlying

它已经在 GCC 11、Clang 13 和 MSVC 19.30(又名 2022 17.0)的标准库中实现。

在您能够使用 C++23 之前,我建议您(重新)将任何自定义实现命名为 to_underlying 并将其放在 #if !defined(__cpp_lib_to_underlying) #endif 块之间,这是相关的功能测试宏。这样,当 C++23 可供您使用时,您可以在将来某个时候简单地放弃代码。

原文由 Stacker 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题