¿Cómo se deberían traducir las enumeraciones de C bitflag a C ++?

C ++ es principalmente un superconjunto de C, pero no siempre. En particular, mientras que los valores de enumeración tanto en C como en C ++ se convierten implícitamente en int, lo contrario no es cierto: solo en C los ints se vuelven a convertir en valores de enumeración. Por lo tanto, bitflags definidos a través de declaraciones de enumeración no funcionan correctamente. Por lo tanto, esto está bien en C, pero no en C ++:

typedef enum Foo
{
    Foo_First = 1<<0,
    Foo_Second = 1<<1,
} Foo;

int main(void)
{
    Foo x = Foo_First | Foo_Second; // error in C++
    return 0;
}

¿Cómo debería manejarse este problema de manera eficiente y correcta, idealmente sin dañar la naturaleza amigable del depurador de usar Foo como el tipo de variable (se descompone en las marcas de bits de los componentes en los relojes, etc.)?

Considere también que puede haber cientos de tales enumeraciones de banderas, y muchos miles de puntos de uso. Idealmente, algún tipo de sobrecarga de operador eficiente haría el truco, pero realmente debería ser eficiente; La aplicación que tengo en mente está vinculada a la informática y tiene la reputación de ser rápida.

Aclaración: estoy traduciendo un programa de C grande (> 300 K) a C ++, por lo que estoy buscando una traducción eficiente tanto en tiempo de ejecución como en tiempo de desarrollador. Simplemente insertando moldes en todos los lugares apropiados podría llevar semanas.

Respuestas a la pregunta(3)

Su respuesta a la pregunta