Если у вас есть поле флагов (то есть: битовое поле), я бы настоятельно посоветовал вам не использовать enum class
для битовых полей.
Существуют строго типизированные перечисления, ну, в общем, строго типизированные . Он превращает перечислители в нечто большее, чем просто именованные константы, как обычные перечисления Идея заключается в том, что если у вас есть переменная типа enum class
, то ее содержимое должно всегда точно соответствовать одному из значений перечислителя. Вот почему не существует неявного преобразования из или в целочисленные типы.
Но это не то, что вы делаете. Вы берете битовое поле, которое представляет собой композицию значений перечислителя. Эта композиция сама по себе не является одной из этих ценностей; это их комбинация. Следовательно, вы лжете , когда говорите, что принимаете тип enum class
; вы просто берете целое число без знака, чтобы мог быть одним из enum class
перечислителей.
Например:
enum class Foo
{
First = 0x01,
Second = 0x02,
Third = 0x04,
};
Foo val = Foo::First | Foo::Second;
val
в этом случае не содержит First
, Second
или Third
. Вы потеряли строгую типизацию, потому что она не содержит ни одного из типов.
enum class
значения не могут быть неявно преобразованы в bool; они не могут быть неявно преобразованы в целые числа; и они не могут неявно выполнять большинство математических операций над ними. Это непрозрачные значения .
И поэтому они не подходят для использования в качестве битовых полей. Попытка использовать enum class
таким неподходящим способом приведет только к большому количеству каста. Просто используйте обычный старый enum
и избавьте себя от боли.