C++11 与枚举的差异
c++11 vs enums differences
//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 的情况下使用枚举?
你不能。。。但是您可以从enum class
中删除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 样式的枚举类型。它还会推断基础类型,因此您不必再在代码中提及。有关详细说明,请参阅此答案。
相关文章:
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 连续枚举 C++11
- C ++枚举范围无法使用-std=c ++ 98进行编译,但使用-std=c ++ 11可以
- 安全使用严格枚举 C++ 11
- C++11 类中放置的枚举类的重载运算符
- 初始化枚举类 (C++11) 类型的二维 std::数组
- C++11 枚举前向导致"underlying type mismatch"
- 枚举布尔模板参数在C 11中
- 我可以创建一个可以接受任何枚举的模板(非类型)param类吗?C 11
- 使用 C++11 可变参数模板初始化枚举到字符串映射
- C++11 枚举类:加上 int 编译失败,为什么
- C++11 枚举类命名空间块
- 传递 C++11 枚举类作为模板,同时自动推断其类型
- C 11枚举类实例化
- 类型安全的c++11枚举类标志的模板
- 在C++11中分离枚举声明和定义
- 是否可以在C++11中指定枚举的位宽
- 如何在C++11中输出枚举类的值
- 如何在 C++11 中“使用”弱枚举
- C++11 在开关大小写中混合枚举类和无符号 int 将无法编译