Stap 2: Met behulp van opgesomde typen
template
class EnumFlag {
public:
void set(T f) {
_flags |= (1<<(uint64_t)f);
}
void unset(T f) {
_flags &= ~(1<<(uint64_t)f);
}
void toggle(T f) {
_flags ^= (1<<(uint64_t)f);
}
void zero() { _flags = (uint64_t)0; }
bool has(T f) { return (_flags & f); }
private:
uint64_t _flags;
};
Soms kan het een grote pijn te beheren de bitmaskers, vooral wanneer u boven de 32-bits vlag ruimte gaat. Elke kleine fout in uw definiëren kan volledig gooien uit het controleren van uw vlag. Er is een gemakkelijkere manier via bits maskers met behulp van de bits-locatie dynamisch te maken, en ik heb geschreven een klasse die precies dit doet.
enum class MyFlags : uint64_t {
FLAG1 = 1,
FLAG2,
FLAG3,
FLAG4
};
EnumFlag<MyFlags> myFlag;
// Initialize the flags
myFlag.zero();
// Set flag2
myFlag.set(MyFlags::FLAG2);
// Check for flag3
if (myFlag.has(MyFlags.FLAG3) do_something();
U zou natuurlijk uint64_t wijzigen naar uint32_t als je op een 32-bits systeem. U
Gebruik een EnumFlag met 1-geïndexeerde enumerators, als volgt:
Merk op dat de vlaggen zijn alleen items in een genummerde gegevenstype. Dit betekent geen hard te coderen het masker van de vlag de vlag naam en geeft u een gemakkelijke manier om nieuwe vlaggen overal in de structuur van de enum vlag invoegen en volgende keer dat u het zult refactoring alles.
Hoe mooi is dat?!