C++11/14念(七)强类型枚举

强类型枚举

在传统 C++中:

  1. 枚举类型并非类型安全,枚举类型会于当整数。
    些微种截然不同之枚举类型可以开展直接的比(虽然编译器给闹了检讨,但毫无有)
  2. 枚举类型的枚举值名字不可知一如既往,这不是我们盼望观看底结果。

C++11 引入了枚举类(enumaration class) ,并利用 enum class
的语法进行宣示:

enum class new_enum : unsigned int {
    value1,
    value2,
    value3 = 100,
    value4 = 100
};

以斯语法中,枚举类型后面使用了冒号及项目主要字来指定枚举中枚举值的路。
马上叫我们能为枚举赋值(未指定时将默认使用 int) 。

如此定义之枚举实现了花色安全:

  1. 未克被隐式的转移为整数
  2. 莫能够以其及整数数字进行较
  3. 不能够针对两样门类的枚举值C++进行较。

不过同样类别枚举值之间可展开比:

if (new_enum::value3 == new_enum::value4) {
    // 会输出
    std::cout << "new_enum::value3 == new_enum::value4" << std::endl;
}

当我们希望赢得枚举值的价值时,必须显式的拓展类型转换。
或者通过重载 << 这个算符来拓展输出,可以藏下面这个代码段:

#include <iostream>
template<typename T>
std::ostream& operator<<(typename std::enable_if<std::is_enum<T>::value,std::ostream>::type& stream,
                         const T& e)
{
    return stream << static_cast<typename std::underlying_type<T>::type>(e);
}

这儿,下面的代码用会为编译:

std::cout << new_enum::value3 << std::endl