c++11 enum class

GCC 官方站点提供了很好的文档,这里非常好的解释了为什么要引入enum class这个强类型enum。

任何希望精通C++的人,其实都应该认真的阅读C++的标准文档,而不是只看别人写的书,第一手资料,特别是标准文档永远都是不可替代的。然后才是其他的书籍帮助更深的理解这些标准。

提供这个enum class的原因是因为旧的enum有不少缺点。简单描述一下:

1. 容易被隐式转换成int

2. underlying type 指的是编译器实现者幕后的实现细节导致了跨平台,跨编译器的不一致性。尺寸的不可估计等等。

3. 没有严格的scope界限


文档中还分析了试图解决以上问题的方法,但是最终都因为有各自的缺陷,还是创造了enum class来解决。技术总是不断的发展,enum class今天看解决了过去的问题,或许不久又会发现其还有缺点。:)


下面我写了一个例子:

[plain]  view plain copy print ?
  1. #ifndef BEAN_REST_CODE_H_  
  2. #define BEAN_REST_CODE_H_  
  3.   
  4. enum class RestCode { OK, ADD_CPU_ERROR };  
  5.   
  6. #endif  
松了一口气,幸亏没有搞得像Java的Enum那么复杂。

现在不能隐式转换成int了,那么如果我真的需要这样做怎么办?比如序列化到流里面。用underlying_type。来自stackoverflow一个帖子,据说这个代码又来自某开源库。

[plain]  view plain copy print ?
  1. #ifndef HELPER_ENUM_HELPER_H_  
  2. #define HELPER_ENUM_HELPER_H_  
  3.   
  4. template <typename Enumeration>  
  5. auto as_integer(Enumeration const value)  
  6. -> typename std::underlying_type<Enumeration>::type  
  7. {  
  8. return static_cast<typename std::underlying_type<Enumeration>::type>(value);  
  9. }  
  10.   
  11. #endif  



至于语法怎么用,文档中有详细描述。仔细阅读吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值