Paso 2: Uso de tipos enumerados
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;
};
A veces puede ser un gran dolor para gestionar las máscaras de bits, sobre todo cuando vas por encima del espacio de 32 bits de bandera. Cualquier pequeño error en tu define completamente puede deshacerse de su comprobación de bandera. Hay una manera más fácil a través de la creación dinámica de máscaras de bits con la localización de pedacito, y he escrito una clase que lo hace solo.
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();
Obviamente cambiaría uint64_t a uint32_t si estás en un sistema de 32 bits. Se
Utilice un EnumFlag con enumeradores indexadas 1, así:
Observe que las banderas son simplemente elementos de un tipo de datos enumerados. Esto no significa duro código de la máscara de la bandera con el nombre de la bandera y le da una manera fácil de insertar nuevas banderas en cualquier parte de la estructura de la bandera de enum y la próxima vez que se compila a refactorizar todo.
¿Cómo limpio es?!