Компактный неповторяющийся способ для флага ALL в перечислениях, которые представляют битовые флаги в C ++ - PullRequest
0 голосов
/ 01 декабря 2018

Я часто использую перечисления для битовых флагов, например:

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

?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Корень проблемы здесь в том, как вам могут понадобиться однобитные.Это зависит от количества счетчиков ранее.Попытка определить ALL внутри перечисления приводит к тому, что случай круговой логики

Вместо этого вы должны определить это вне перечисления:

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

EventType{} имеет достаточное количество нулей, ~ превращает его в целочисленный тип с достаточным количеством, поэтому вам нужно еще одно приведение обратно к EventType

0 голосов
/ 01 декабря 2018

Используйте то, что всегда будет охватывать все остальные опции, например:

ALL = 0xFFFFFFFF

Или, как прокомментировал Swordfish, вы можете перевернуть биты целочисленного литерала без знака:

ALL = ~0u

Чтобы ответить на ваш комментарий, вы можете явно указать компилятору, какой тип вы хотите, чтобы ваш enum имел:

enum EventType : unsigned int
...