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

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中,如何输出枚举类的值

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值