使用enum class代替enum

作者: Roland | 来源:发表于2015-06-24 21:54 被阅读3306次
    enum Alert { green, yellow, orange, red }; // traditional enum
    enum class Color { red, blue }; // new enum

C++11里面提出了一个新的概念enum class。它的特点是。

新的enum的作用域不在是全局的了。

原来enum名字的作用域是全局的。

    Alert a1 = red; //ok
    Alert a2 = Alert::red; //error in C++98; ok in C++11
    int red = 0; // error, red is redefined

而新的enum class的名字是处于类的作用域里面的。

    Color c1 = Color::blue; //ok
    Color c2 = blue; // error
    int blue = 0; //ok, blue is in class scope

不能隐式转换成其他类型

    int i = Alert::red; //ok for old enum
    int k = Color::blue; // error for new enum

这个特性我特别喜欢,可以有更严格类型系统,本来red和blue和数字就是两个系统的东西,没理由互相转换。

C++11里面可以指定用特定的类型来存储enum值了。

看下面这个问题,struct Data是对应着某个硬件的寄存器,所以这里我们使用了固定精度的整形uint8_t,然后使用了#pragma pack(push, 1)来禁止了结构体内部的padding。对于flag,我一项喜欢使用enum,而不是宏来定义。但是在C++11以前,enum值的大小是一个编译器相关的事情,所以在这个场景下,struct Data大小必须和硬件寄存器一样,所以就不能用enum来作为flag的类型。

#define FLAG_1 (0x1)
#define FLAG_2 (0x2)
#define FLAG_3 (0x4)
#pragma pack(push, 1)
struct Data{
    uint8_t  data1;
    uint16_t  flag;
    uint8_t  data2;
};
#pragma pack(pop)

在C++11里面,enum的大小是可以指定的了,像下面这样。

    enum Alert : int { green, yellow, orange, red }; 
    enum class Color : unsigned char { red, blue }; 

所以前面的那段代码,我基本上会写成下面这样,使用enum FLAG代替uint16_t来声明flag了。

#pragma pack(push, 1)
struct Data{
    enum FLAG : uint16_t { 
        FLAG_1 = 0x1, 
        FLAG_2 = 0x2, 
        FLAG_3 = 0x4 
    };
    uint8_t  data1;
    FLAG  flag;
    uint8_t  data2;
};
#pragma pack(pop)
Data d = { 1, Data::FLAG_1, 2 };

相关文章

  • 使用enum class代替enum

    C++11里面提出了一个新的概念enum class。它的特点是。 新的enum的作用域不在是全局的了。 原来en...

  • 提高C++接口的易用性

    使用enum代替bool值 使用enum代替有限的int值,例如月份 使用类代替int,例如月、年 提供类似工厂类...

  • 编写高质量代码61条建议中---借鉴备注

    2>.h文件中减少使用#import 改用@class 3>用const enum代替#define 4>字面量的...

  • Python枚举类型

    from enumimport Enum class Color(Enum): Yellow ="#111" ...

  • kotlin基础知识二: enum和when

    一、enum class 1. 声明一个带有属性的enum class 在kotlin语法中唯一需要使用分号的地方...

  • Java 枚举

    enum 在 Java 中使用 enum 关键字来定义枚举类,其地位与 class、interface 相同在 J...

  • 枚举类型

    java.lang.Enum static Enum valueOf(Class enumClass, St...

  • Java核心类-枚举类

    Java 进阶——枚举enum使用小结及使用枚举替代你的常量类 通过enum定义的枚举类,和其他的class没有任...

  • 注解

    定义注解 Kotlin使用 annotation class 关键字(就像使用 enum class 定义枚举类一...

  • Kotlin 高级编程语言特性代码实例

    定义接口 使用注解 实现接口 枚举类 enum class BizEnum 注解 annotation class...

网友评论

    本文标题:使用enum class代替enum

    本文链接:https://www.haomeiwen.com/subject/wixeqttx.html