具有作用域但无需转换为基础类型的枚举类

Pte*_*tyl 6 c++ c++11

我有这个:

enum class Categories : uint32_t {
    C6 = 0x00000020,
    C7 = 0x00000040,
    C8 = 0x00000080,
    ...
};
Run Code Online (Sandbox Code Playgroud)

我选择了一个枚举类,因为它非常适合确定范围。但缺点是,当我需要使用类别作为按位运算的掩码位时,我需要首先将它们转换为 uint32_t。

例子:

uint32_t masterCat = ((uint32_t)MyClass::Categories::C6) | ((uint32_t)MyClass::Categories::C7);

有没有一种方法可以获得相同的范围优势,而不必在每次使用之前进行转换?如果我使用常规枚举,那么我就会失去范围优势:(

例子:

uint32_t masterCat = (MyClass::Categories::C6) | (MyClass::Categories::C7);

JaM*_*MiT 6

将其拆分enum class为 anenum和 a class(或struct为了方便起见)。

struct Categories {
    enum : uint32_t {
        C6 = 0x00000020,
        C7 = 0x00000040,
        C8 = 0x00000080,
    };
};
Run Code Online (Sandbox Code Playgroud)

由于enum是嵌入类型,因此您需要指定Categories才能访问它,如 中所示Categories::C6

如果这是在另一个类中,例如

class MyClass {
  public:
    struct Categories {
        enum : uint32_t {
            C6 = 0x00000020,
            C7 = 0x00000040,
            C8 = 0x00000080,
        };
    };
};
Run Code Online (Sandbox Code Playgroud)

那么您可以使用MyClass::Categories::C6来引用其中一个枚举,但两者都MyClass::C6不起作用C6