2013-08-28 123 views
3
//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++ - 枚举差异

+1

第一个版本继续在C++ 11中工作,但我想你想获得实际的枚举成员的好处,只想获得枚举成员的数量的方法? – delnan

+0

“enum类”的好处是你不能混合不同枚举的值吗? – Appleshell

回答

10

如何使用枚举在这种情况下没有铸造枚举为int的数量?*

你不能...但是你可以删除classenum 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 enumshere


另一种选择是投它,就像你在做什么。但是您应该避免使用旧的 C-style cast并使用 static_cast<>来代替,因为这具有更好的类型安全性并且更加明确。

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

实际上在第二种情况下,你不能在没有投射的情况下写。

既然你已经使用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