//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++ 11 vs C++ - 枚举差异
//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++ 11 vs C++ - 枚举差异
如何使用枚举在这种情况下没有铸造枚举为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
here
C-style cast
并使用
static_cast<>
来代替,因为这具有更好的类型安全性并且更加明确。
//C++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[static_cast<size_t> (SCOUNT) ]; // OK
实际上在第二种情况下,你不能在没有投射的情况下写。
既然你已经使用CAST,你现在可以做的是使用更好投,而不是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样式枚举类型。它还推导出基础类型,所以您不必在代码中提及。有关详细说明,请参阅this answer。
第一个版本继续在C++ 11中工作,但我想你想获得实际的枚举成员的好处,只想获得枚举成员的数量的方法? – delnan
“enum类”的好处是你不能混合不同枚举的值吗? – Appleshell