在 C++ 中表示位标志的枚举中的 ALL 标志的紧凑非重复方式

Compact non-repetitive way for an ALL flag in enums that represent bitflags in C++

我经常将枚举用于位标志,如下所示

enum EventType {
    NODE_ADDED = 1 << 0,
    NODE_DELETED = 1 << 1,
    LINK_ADDED = 1 << 2,
    LINK_DELETED = 1 << 3,
    IN_PIN_ADDED = 1 << 4,
    IN_PIN_DELETED = 1 << 5,
    IN_PIN_CHANGE = 1 << 6,
    OUT_PIN_ADDED = 1 << 7,
    OUT_PIN_DELETED = 1 << 8,
    OUT_PIN_CHANGE = 1 << 9,

    ALL = NODE_ADDED | NODE_DELETED | ...,
};

是否有一种干净、重复性较低的方法来定义一个 ALL 标志,将所有其他标志组合在一个枚举中?对于小型枚举,上述方法运行良好,但假设一个枚举中有 30 个标志,这样做会很乏味。像这样(一般来说)有用吗

ALL = -1

?

使用始终涵盖所有其他选项的内容,例如:

ALL = 0xFFFFFFFF

或者正如 Swordfish 评论的那样,您可以翻转无符号整数文字的位:

ALL = ~0u

要回答您的评论,您可以明确告诉编译器您希望枚举具有什么类型:

enum EventType : unsigned int

这里的根本问题是您需要多少一位。这取决于之前的普查员数量。试图在枚举中定义 ALL 会导致循环逻辑

相反,您必须在枚举之外定义它:

const auto ALL = (EventType) ~EventType{};

EventType{} 有足够的零,~ 把它变成一个有足够零的整数类型,所以你需要再转换回 EventType