¿Extendiendo enumeraciones en C ++?

¿Hay alguna forma en C ++ de extender / “heredar” enumeraciones?

ES DECIR:

enum Enum {A,B,C}; enum EnumEx : public Enum {D,E,F}; 

o al menos definir una conversión entre ellos?

No no hay.

enum son realmente lo peor en C ++, y eso es desafortunado, por supuesto.

Incluso la class enum introducida en C ++ 0x no aborda este problema de extensibilidad (aunque al menos hacen algunas cosas para la seguridad del tipo).

La única ventaja de enum es que no existen: ofrecen algún tipo de seguridad sin imponer ninguna sobrecarga de tiempo de ejecución ya que son sustituidas por el comstackdor directamente.

Si quieres una bestia así, tendrás que trabajar tú mismo:

  • crea una clase MyEnum , que contiene un int (básicamente)
  • crear constructores con nombre para cada uno de los valores interesantes

ahora puede extender su clase (agregando constructores nombrados) a voluntad …

Sin embargo, esa es una solución, nunca he encontrado una manera satistificante de lidiar con una enumeración …

Si pudieras crear una subclase de una enumeración, tendría que funcionar al revés.

El conjunto de instancias en una subclase es un subconjunto de las instancias en la superclase. Piensa en el ejemplo estándar de “Forma”. La clase Shape representa el conjunto de todas las Formas. La clase Circle, su subclase, representa el subconjunto de Formas que son Círculos.

Entonces, para ser consistente, una subclase de una enumeración debería contener un subconjunto de los elementos en la enumeración de la que hereda.

(Y no, C ++ no es compatible con esto).

Lo he resuelto de esta manera:

 typedef enum { #include "NetProtocols.def" } eNetProtocols, eNP; 

Por supuesto, si agrega un nuevo protocolo de red en el archivo NetProtocols.def, debe volver a comstackr, pero al menos es expandible.

http://www.codeproject.com/KB/cpp/InheritEnum.aspx repasa un método para crear una enumeración expandida.

Solo una idea:

Podría tratar de crear una clase vacía para cada constante (tal vez ponerlos todos en el mismo archivo para reducir el desorden), crear una instancia de cada clase y usar los punteros a estas instancias como las “constantes”. De esta forma, el comstackdor comprenderá la herencia y realizará cualquier conversión ChildPointer-to-ParentPointer necesaria al usar llamadas a funciones, Y usted todavía obtiene verificaciones de seguridad de tipo por parte del comstackdor para asegurarse de que nadie transfiera un valor int inválido a las funciones (lo que tendría para usar si usa el método de valor LAST para “extender” la enumeración).

Aunque todavía no lo he pensado del todo, cualquier comentario sobre este enfoque es bienvenido.

Y trataré de publicar un ejemplo de lo que quiero decir tan pronto como tenga algo de tiempo.

El siguiente código funciona bien.

 enum Enum {A,B,C}; enum EnumEx {D=C+1,E,F};