Un bitset mejorado como alternativa a los enum flags en C++

Fuentes: A better bitset for enum flags

El lenguaje C++ ha apostado durante años por las enumeraciones con operadores bitwise para representar banderas (bitflags), un patrón habitual en C y replicado en otros lenguajes. La propuesta P4313, basada en la reflexión de C++26, define cómo activar esa sintaxis sobre un enum, pero su autor sostiene que, aunque funcione, va en la dirección equivocada: las enum bitflags son «fáciles, pero no simples», porque mezclan la tarea de nombrar los bits con la de representarlos, lo que rompe en la práctica la seguridad de tipos cuando se combinan valores con el operador OR.

El artículo defiende un diseño alternativo centrado en un bitset enriquecido, parametrizable por un enum que solo nombra los bits (incluido un valor MAX convencional) y sin necesidad de pre-desplazar los valores a potencias de dos. Con este bitset, el acceso se realiza con operator[], evitando los conocidos problemas de precedencia de los operadores bitwise en C y C++. El tipo preserva la información del enum, impide la conversión implícita desde otros tipos y separa claramente la responsabilidad: el enum nombra y el bitset representa.

Además, el bitset propuesto admite elegir el tipo integral subyacente (uint8_t, uint32_t, array…), lo que permite ajustar tamaño y rendimiento según la plataforma, desde microcontroladores hasta servidores. También ofrece métodos explícitos de conversión a tipos integrales para facilitar la serialización.

El autor reconoce limitaciones: tratar enums de terceros sigue siendo incómodo, ya que se necesita un valor MAX accesible, algo que la reflexión podría resolver. Aun así, concluye que, probablemente, la comunidad C++ acabará adoptando los enum flags por inercia, como ya ocurrió en el pasado.