//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];
在不将枚举计数转换为整数的情况下,我该如何在这种情况下使用枚举?
//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];
在不将枚举计数转换为整数的情况下,我该如何在这种情况下使用枚举?
//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
您可以在这里了解有关强类型枚举的更多信息。
C风格强制转换
,而应改用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);
}