Пересматривая старый код на C++, я наткнулся на несколько битовых флагов, определенных как перечисления.
enum FooFlags
{
FooFlag1 = 1 << 0,
FooFlag2 = 1 << 1,
FooFlag3 = 1 << 2
// etc...
};
Это не редкость, но меня беспокоило, что как только вы начинаете комбинировать флаги, вы теряете информацию о типе.
int flags = FooFlag1 | FooFlag2; // We've lost the information that this is a set of flags relating to *Foo*
Некоторый поиск на SO показал, что я не только one обеспокоен этим.
Одна из альтернатив — объявить флаги как #define или константные интегралы, чтобы побитовые операции не преобразовывали тип (вероятно). Проблема в том, что это позволяет нашему набору битов смешиваться с несвязанными флагами через целые числа или другие перечисления.
Я знаком с std::bitset и boost::dynamic_bitset, но ни один из них не предназначен для решения моей проблемы. Я ищу что-то вроде FlagsAttribute С#.
Мой вопрос в том, какие другие решения существуют для (более) безопасного набора битовых флагов?
Ниже я опубликую собственное решение.