Lors de la révision d'un ancien code C++, j'ai rencontré plusieurs bitflags définis comme enums.Tapez-vous des drapeaux (r) sûrs en C++?
enum FooFlags
{
FooFlag1 = 1 << 0,
FooFlag2 = 1 << 1,
FooFlag3 = 1 << 2
// etc...
};
Ce n'est pas rare, mais il me dérangeait que dès que vous commencez à combiner des drapeaux, vous perdez les informations de type.
int flags = FooFlag1 | FooFlag2; // We've lost the information that this is a set of flags relating to *Foo*
quelques recherches sur SO montré que je ne suis pas le onlyone dérangé par cela.
Une alternative consiste à déclarer des indicateurs comme des #defines ou des intégrales const, de sorte que les opérations au niveau des bits ne transformeraient pas le type (probablement). Le problème avec ceci est qu'il permet à notre ensemble de bits de se mélanger avec des drapeaux sans rapport, via ints ou d'autres énumérations. Je connais std::bitset et boost::dynamic_bitset, mais aucune d'entre elles n'est conçue pour résoudre mon problème. Ce que je cherche, c'est quelque chose comme FlagsAttribute de C#.
Ma question est, quelles autres solutions sont là pour un (plus) type de coffre-fort de bitflags?
Je posterai ma propre solution ci-dessous.
Une chance d'exemple d'utilisation pour votre implémentation? – Eric
@Eric, je pense que ce serait plutôt simple. Que recherchez-vous exactement? – luke
Un exemple simple de déclaration d'une énumération 'E', l'instanciation d'un' FlagSet ', et son utilisation. Bien sûr, je pourrais y arriver, mais un exemple rendrait cette réponse meilleure. –
Eric