web-dev-qa-db-fra.com

Étendre des énumérations en C++?

Est-il possible en C++ d'étendre/"hériter" des énumérations?

C'EST À DIRE:

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

ou au moins définir une conversion entre eux?

65
cvb

Non, il n'y en a pas.

enum sont vraiment la pauvre chose en C++, et c'est malheureux bien sûr.

Même le class enum introduit dans C++ 0x ne résout pas ce problème d’extensibilité (bien qu’ils fassent au moins certaines choses pour la sécurité de type).

Le seul avantage de enum est qu’elles n’existent pas: elles offrent une sécurité de type tout en n’imposant aucune surcharge d’exécution, car elles sont directement remplacées par le compilateur.

Si vous voulez une telle bête, vous devrez travailler vous-même:

  • créer une classe MyEnum, qui contient un int (fondamentalement)
  • créer des constructeurs nommés pour chacune des valeurs intéressantes

vous pouvez maintenant étendre votre classe (en ajoutant des constructeurs nommés) à volonté ...

C'est une solution de contournement cependant, je n'ai jamais trouvé un moyen satistifiant de traiter un dénombrement ...

58
Matthieu M.

Si vous pouviez créer une sous-classe d'une énumération, il devrait fonctionner dans l'autre sens.

L'ensemble d'instances d'une sous-classe est un sous-ensemble des instances de la super-classe. Pensez à l'exemple standard "Shape". La classe Shape représente l'ensemble de toutes les formes. La classe Circle, sa sous-classe, représente le sous-ensemble de formes qui sont des cercles.

Donc, pour être cohérent, une sous-classe d'une énumération devrait contenir un sous-ensemble des éléments de la énumération dont elle hérite.

(Et non, C++ ne supporte pas cela.)

7
Laurence Gonsalves

J'ai résolu de cette façon:

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

Bien sûr, si vous ajoutez un nouveau protocole de réseau dans le fichier NetProtocols.def, vous devez recompiler, mais au moins, il est extensible.

7
marco

http://www.codeproject.com/KB/cpp/InheritEnum.aspx passe sur une méthode pour créer une énumération étendue.

2
BadPirate

Une solution de contournement simple mais utile pour cet écart c ++ pourrait être la suivante:

#define ENUM_BASE_VALS A,B,C
enum Enum {ENUM_BASE_VALS};
enum EnumEx {ENUM_BASE_VALS, D,E,F};
0
Marat

Juste une idée:

Vous pouvez essayer de créer une classe vide pour chaque constante (peut-être les mettre toutes dans le même fichier pour réduire l'encombrement), créer une instance de chaque classe et utiliser les pointeurs sur ces instances en tant que "constantes". De cette façon, le compilateur comprendra l’héritage et effectuera toute conversion ChildPointer-to-ParentPointer nécessaire lorsqu’il utilise des appels de fonction. à utiliser si vous utilisez la méthode de la dernière valeur pour "étendre" l'énumération).

Nous n’avons pas bien réfléchi à cela, alors tout commentaire sur cette approche est le bienvenu.

Et je vais essayer de poster un exemple de ce que je veux dire dès que j'ai un peu de temps.

0
elatalhm