c++11中输出enum class变量的数值

来源:互联网 发布:潘安传奇网络电影 编辑:程序博客网 时间:2024/06/07 06:08

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);}

还有一种方法就是为特定枚举类重载<<操作符。这个就不写了,思路都一样。

参考

c++11 enum class
enum class 文档
在C++11中,如何输出枚举类的值

原创粉丝点击