//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 的情况下使用枚举?
//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 的情况下使用枚举?*
你不能......但你可以class
从enum class
class
关键字意味着您不能在它们之间隐式转换,而enum
删除int
关键字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 风格的枚举类型。它还推导出底层类型,因此您不必再在代码中提及。有关详细说明,请参阅此答案。