Étape 2: À l’aide de Types énumérés
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;
};
Il peut parfois être une grande douleur pour gérer les masques de bits, en particulier lorsque vous dépassez l’espace de 32-bit indicateur. Toute petite erreur dans votre définition peut lever complètement désactiver la vérification de votre drapeau. Il y a un moyen plus facile grâce à la création dynamique des masques de bits à l’aide de l’emplacement du bit, et j’ai écrit une classe qui s’en vient.
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();
Vous remplaceriez évidemment uint64_t à uint32_t si vous êtes sur un système 32 bits. Vous
utiliser un EnumFlag d’énumérateurs commençant à 1, comme ceci :
Notez les drapeaux quelques éléments dans un type de données énuméré. Cela ne signifie aucun coder en dur le masque de drapeau au nom du drapeau et vous donne un moyen facile pour insérer de nouveaux drapeaux n’importe où dans la structure du drapeau enum et prochaine fois que vous compilez il vous refactorisez le tout.
Comment soigné est qui? !