C++ c++;11对c++;-枚举差异

C++ c++;11对c++;-枚举差异,c++,c++11,enums,strongly-typed-enum,C++,C++11,Enums,Strongly Typed Enum,在这种情况下,如何使用枚举而不将枚举计数强制转换为int 在这种情况下,如何使用枚举而不将枚举计数强制转换为int* 你不能。。。但是您可以从enum类 >代码>类< /Cord>关键字,意味着不能在“ EnUM < /C> >和 int 之间进行隐式转换。删除类< /Cord>关键字意味着您的 EnUM/COD>将以与以前版本C++相同的方式工作。您不需要强制转换,但通过允许对整数值进行隐式强制转换,您失去了强类型枚举的安全性 //c++03 enum Something { S1

在这种情况下,如何使用枚举而不将枚举计数强制转换为int

在这种情况下,如何使用枚举而不将枚举计数强制转换为int*

你不能。。。但是您可以从
enum类

<> >代码>类< /Cord>关键字,意味着不能在“<代码> EnUM < /C> >和<代码> int <代码>之间进行隐式转换。删除<代码>类< /Cord>关键字意味着您的<代码> EnUM/COD>将以与以前版本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];
您可以阅读有关强类型枚举的更多信息
另一个选择是像你现在做的那样投下它。但是您应该避免使用旧的
C-style类型转换
,而是使用
static\u-cast
,因为这具有更好的类型安全性和更明确的含义

//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++11
枚举类某物
{
S1=0,
S2,
童子军
};
int arr[静态铸造<尺寸>(童子军)];//好啊

实际上,在第二种情况下,如果不使用强制转换,就无法编写它

由于您必须使用cast,现在您可以使用更好的cast而不是c型cast:

//C++11
enum class Something
{
    S1 = 0,
    S2,
    SCOUNT
};
int arr[static_cast< size_t > ( SCOUNT ) ]; // OK
其中
to_integral
定义为:

int arr[to_integral(Something::SCOUNT)];
#include//它是定义std::底层_类型的地方
模板
constexpr auto to_integral(E)->typename std::底层_type::type
{
返回静态_-cast(e);
}

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

第一个版本继续在C++11中工作,但我认为您希望为实际的枚举成员获得好处,并且只希望获得枚举成员数的方法。
enum class
的好处不就是不能混合不同枚举的值吗?
#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);
}