Enum , Enum Class ?
使用Enum还是Enum Class?
根据Enum和Enum Class的特点,我们可以根据对常量类型的要求决定使用Enum还是Enum Class。
以下场景适合使用Enum:
- 常量类型用于内部表示,不用于显示名字。
- 常量值不需要提供附加的属性。例如只需要知道国家代码,而不需要获得国家的其它属性
- 枚举值允许组合(即支持位操作)。
Enum Class可以适用于更多的场景:
- 常用于可提供友好信息的类型。如本地化支持的类型名显示,或者显示与枚举名不一致的名字,例如Country.CHN可显示为"China"。
- 提供更多的常量属性。
- 提供更加丰富的行为。如Parse方法。
- 对常量进行分组。如Country.Asia包含亚洲国家。
使用Struct来表示枚举
如果值域不封闭,但希望提供一些常量,也可以使用struct,如System.Drawing.Color结构中的系统默认颜色设置。采用struct来设计enum值同Enum Class方式没有本质的差异,只是struct默认提供无参数构造函数,因此无法实现封闭值域。\
\
任何希望精通C++的人,其实都应该认真的阅读C++的标准文档,而不是只看别人写的书,第一手资料,特别是标准文档永远都是不可替代的。然后才是其他的书籍帮助更深的理解这些标准。
提供这个enum class的原因是因为旧的enum有不少缺点。简单描述一下:
1. 容易被隐式转换成int
2. underlying type 指的是编译器实现者幕后的实现细节导致了跨平台,跨编译器的不一致性。尺寸的不可估计等等。
3. 没有严格的scope界限
文档中还分析了试图解决以上问题的方法,但是最终都因为有各自的缺陷,还是创造了enum class来解决。技术总是不断的发展,enum class今天看解决了过去的问题,或许不久又会发现其还有缺点。:)
下面我写了一个例子:
#ifndef BEAN_REST_CODE_H_
#define BEAN_REST_CODE_H_ enum class RestCode { OK, ADD_CPU_ERROR }; #endif
松了一口气,幸亏没有搞得像Java的Enum那么复杂。
现在不能隐式转换成int了,那么如果我真的需要这样做怎么办?比如序列化到流里面。用underlying_type。来自stackoverflow一个帖子,据说这个代码又来自某开源库。
#ifndef HELPER_ENUM_HELPER_H_
#define HELPER_ENUM_HELPER_H_ 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);
} #endif
至于语法怎么用,文档中有详细描述。仔细阅读吧。
Enum , Enum Class ?的更多相关文章
- [enum]enum的用法
ENUM概况 enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型,其特点在于enum类型的变量取值是有限的,是可以一一列举出来的. ENUM定义 C++ e ...
- enum 与 enum class
c++11中引入了新的枚举类型---->强制枚举类型 // unscoped enum: enum [identifier] [: type] {enum-list}; // scoped e ...
- 关于Java中枚举Enum的深入剖析
在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java ...
- 揭开枚举类的面纱(Unlocking the Enumeration/enum Mystery)
枚举给用户定义固定数据组提供了方便.枚举类就是一系列常量整型值,这也就意味着枚举类型不能被修改. 这里我们将要讨论C语言中枚举类型的用法和限制. 枚举通过枚举关键值定义,类似结构体定义 语法(Synt ...
- java源码学习(三)Enum
Enum Enum类是java.lang包中一个类,他是Java语言中所有枚举类型的公共基类. 一.定义 public abstract class Enum<E extends Enum< ...
- Python 枚举 enum
Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...
- 枚举类型enum详解——C语言
enum enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶 ...
- How do I convert an enum to a list in C#?
How do I convert an enum to a list in C#? This will return an IEnumerable<SomeEnum> of all the ...
- 集合 enum 枚举 简介 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- Java web概述
声明:为了使初学者能更好的了解java web,所以我整理了下资料,概述了web应用程序. 一.web概述 静态web资源:内容是静态的,不同的人在不同的时间来访问时都是相同的内容.HTML.CSS. ...
- 几个常用的Linux监控脚本
几个常用的Linux监控脚本 几个常用的Linux监控脚本下面是几个主机监控的脚本,大家可以根据自己的情况再进行修改,希望能给大家一点帮助.1.查看主机网卡流量#!/bin/bash#network# ...
- [Z] SVN的trunk、branch、tag
Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-ta ...
- 学习 Python 编程的 19 个资源 (转)
学习 Python 编程的 19 个资源 2018-01-07 数据与算法之美 编译:wzhvictor,英文:codecondo segmentfault.com/a/119000000418731 ...
- linux命令 环境设置 顺序
转 http://blog.csdn.net/dingxy/article/details/4016383 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/prof ...
- think in avalon
1.不要设计,也不要通过DOM操作去改变你的页面 你用jQuery去设计一个页面,并让它动起来.这是因为jQuery就是让一切简单的事情变复杂的罪魁祸首. 但是用avalon,你必须从零开始去构思你的 ...
- [Android]RecyclerView添加HeaderView出现宽度问题
通过getItemViewType方式判断HeaderView方式添加HeaderView的,结果发现有几个界面HeaderView宽度不能满屏. 于是对比了几种布局,发现LinearLayout为根 ...
- Application.LoadLevel & Object.DontDestroyOnLoad
[Application.LoadLevel] 只有在File->Build Setting中设置了的按钮才能被加载. 当level加载完成后,MonoBehaviour.OnLevelWasL ...
- Lucene介绍及简单入门案例(集成ik分词器)
介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和 ...
- Spark 性能相关参数配置详解-任务调度篇
随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化. 由于篇 ...