Во время пересмотра старого кода на С++ я столкнулся с несколькими bitflags, определенными как перечисления.
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 показали, что я не только один, обеспокоенный этим.
Один из вариантов - объявить флаги как #defines или const-интегралы, поэтому побитовые операции не будут преобразовывать тип (возможно). Проблема в том, что это позволяет нашему битовому набору связываться с несвязанными флагами через ints или другие перечисления.
Я знаком с std:: bitset и boost:: dynamic_bitset, но ни одна из них не предназначена для решения моей проблемы. Я ищу что-то вроде С# FlagsAttribute.
Мой вопрос в том, какие существуют другие решения для безопасного набора битовых флагов (более) типа?
Я отправлю свое собственное решение ниже.