0

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

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

?

4

2 回答 2

3

使用将始终涵盖所有其他选项的东西,例如:

ALL = 0xFFFFFFFF

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

ALL = ~0u

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

enum EventType : unsigned int
于 2018-12-01T16:00:30.420 回答
1

这里的根本问题是您需要多少位。这取决于以前的枚举数。试图ALL在枚举内部进行定义使得这是一个循环逻辑的例子

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

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

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

于 2018-12-01T17:46:55.583 回答