C++11 与枚举的差异

c++11 vs enums differences

本文关键字:枚举 C++11      更新时间:2023-10-16
//c++03
enum Something
{
    S1 = 0,
    S2,
    SCOUNT
};
int arr[SCOUNT];
//c++11
enum class Something
{
    S1 = 0,
    S2,
    SCOUNT
};
int arr[(int) Something::SCOUNT];

在这种情况下,如何在不将枚举转换为 int 的情况下使用枚举?

在这种情况下,如何在不将枚举转换为 int 的情况下使用枚举?

你不能。。。但是您可以从enum class中删除class

class 关键字意味着您无法在该enumint之间隐式转换 删除 class 关键字意味着您的enum的工作方式与以前版本的 C++ 相同。您不需要强制转换,但通过允许隐式强制转换到整数值,您失去了strongly typed enums的安全性。

//C++11
enum class Something
{
    S1 = 0,
    S2,
    SCOUNT
};
int arr[SCOUNT]; // ERRROR
//C++11
enum Something
{
    S1 = 0,
    S2,
    SCOUNT
};
int arr[SCOUNT]; // OK

您可以在此处阅读有关strongly typed enums的更多信息<小时 />另一种选择是投射它,就像你正在做的那样。但是您应该避免使用旧C-style cast并使用static_cast<>,因为这具有更好的类型安全性并且更明确。

//C++11
enum class Something
{
    S1 = 0,
    S2,
    SCOUNT
};
int arr[static_cast< size_t > ( SCOUNT ) ]; // OK

实际上在第二种情况下,你不能在没有强制转换的情况下编写它。

既然你必须使用强制转换

,你现在可以做的是使用更好的强制转换而不是 C 样式的强制转换:

int arr[to_integral(Something::SCOUNT)];

其中to_integral定义为:

#include <type_traits> //it is where std::underlying_type is defined
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);
}

现在,此函数模板可重用。可用于任何 C++11 样式的枚举类型。它还会推断基础类型,因此您不必再在代码中提及。有关详细说明,请参阅此答案。