Как я могу перегрузить оператор |=
на строго типизированном (scoped) enum
(в С++ 11, GCC)?
Я хочу проверить, установить и очистить бит на строго типизированных перечислениях. Почему сильно набрали? Потому что мои книги говорят, что это хорошая практика. Но это означает, что я должен static_cast<int>
всюду. Чтобы предотвратить это, я перегружаю операторы |
и &
, но я не могу понять, как перегрузить оператор |=
на перечисление. Для класса вы просто ставили определение оператора в классе, но для перечислений, которые не работают синтаксически.
Это то, что у меня есть до сих пор:
enum class NumericType
{
None = 0,
PadWithZero = 0x01,
NegativeSign = 0x02,
PositiveSign = 0x04,
SpacePrefix = 0x08
};
inline NumericType operator |(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) | static_cast<int>(b));
}
inline NumericType operator &(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) & static_cast<int>(b));
}
Причина, по которой я делаю это: так работает в сильно типизированном С#: перечисление есть только структура с полем своего базового типа и набор констант, определенных на нем. Но он может иметь любое целочисленное значение, которое вписывается в скрытое поле enum.
И похоже, что С++ перечисления работают точно так же. На обоих языках отбрасывание требуется от enum до int или наоборот. Тем не менее, в С# побитовые операторы перегружены по умолчанию, а в С++ - нет.