enum class强枚举类
c++11中定义了强枚举类,即enum class
,与之前的enum
类型相比,它解决了以下三个问题:
1. 枚举类型与整形之间的隐式转换:
2. 底层类型无法由程序员指定:
3. 弱作用域
用实例来看一下,首先最大的变化是定义方式:
c++03: enum Color{Red, Yellow, Blue};
c++11: enum class Color{Red, Yellow, Blue};
明显可以看到在enum
之后添加了class
关键字,并且可以指定底层类型,如:
enum class Color:unsigned long{...};
枚举类默认的底层类型是int
,可以通过如下方式获得一个枚举类的底层类型:
std::underlying_type<Color>::type
强枚举类也强化了作用域的概念,在使用枚举类中的类型时必须添加枚举类名,消除了可能出现的二义性。例如:
c++03:
enum Color{Red. Yellow, Blue};
enum Band{Yellow, Backstreet Boy, Metal};
Color a = Yellow; //???which one?
c++11:
enum class Color{Red. Yellow, Blue};
enum class Band{Yellow, Backstreet Boy, Metal};
Color a = Color::Yellow;//ok
输出枚举类的字面值
在强枚举类出现之前,由于enum
变量可以进行整型提升,所以可以把它当作整型来使用,但在强枚举类出现之后,这个方法行不通了,并且cout
也没有对其提供支持,不能直接输出枚举类的值,如下写法是错误的:
std::cout<<Color::Red<<std::endl;
那么,当我们需要输出一个枚举类变量的值时,该怎么做呢?答案是强制转换。将枚举类变量强制转换为对应的底层类型,再将其输出即可。以Color a
为例,我们要输出a
的值,可以这样做:
Color a = Color::Yellow;
std::cout<<static_cast<std::underlying_type<Color>::type>(a)<<std::endl;
也可以将其写成一个模板:
template <typename Enumeration>
auto as_integer(Enumeration const value)
-> typename std::underlying_type<Enumeration>::type
{
return static_cast<typename std::underlying_type<Enumeration>::type>(value);
}
还有一种方法就是为特定枚举类重载<<
操作符。这个就不写了,思路都一样。