Während einige alten C++ - Code überarbeitet, lief ich über mehrere bitflags definiert als enums.Geben Sie sichere (r) Bitflags in C++ ein?
enum FooFlags
{
FooFlag1 = 1 << 0,
FooFlag2 = 1 << 1,
FooFlag3 = 1 << 2
// etc...
};
Dies ist nicht ungewöhnlich, aber es störte mich, dass, sobald Sie anfangen, Fahnen zu kombinieren, können Sie den Typ-Informationen verlieren.
int flags = FooFlag1 | FooFlag2; // We've lost the information that this is a set of flags relating to *Foo*
Einige Benutzer auf zeigte, so dass ich nicht die onlyone durch diese gestört bin.
Eine Alternative besteht darin, Flags als #defines oder const-Integrale zu deklarieren, also würden bitweise Operationen den Typ (wahrscheinlich) nicht transformieren. Das Problem dabei ist, dass es erlaubt, dass unser Bit-Set mit nicht verwandten Flags, über Ints oder andere Enums gemischt wird.
Ich bin vertraut mit std::bitset und boost::dynamic_bitset, aber beide sind nicht auf mein Problem zugeschnitten. Was ich suche ist etwas wie C# 's FlagsAttribute.
Meine Frage ist, welche anderen Lösungen gibt es für einen (mehr) Typ sicheren Satz von Bitflags?
Ich poste meine eigene Lösung unten.
Gibt es eine Chance für ein Anwendungsbeispiel für Ihre Implementierung? – Eric
@Eric, ich denke, es wäre ziemlich einfach. Was suchen Sie genau? – luke
Ein einfaches Beispiel für das Deklarieren einer Enum'E ', das Instantiieren eines' FlagSet' und dessen Verwendung. Sicher, ich könnte es schaffen, aber ein Beispiel würde diese Antwort besser machen. –
Eric