web-dev-qa-db-fra.com

enum classe de type chaîne en C++

- Informations d'arrière-plan:

Il existe une classe dans C++ 11 appelée classe enum dans laquelle vous pouvez stocker des variables. Cependant, j'ai seulement vu le type de la classe être char:

enum class : char {
   v1 = 'x', v2 = 'y'
};

- Question:

Est-il possible d'exprimer cette classe d'énumération de type chaîne?

Par exemple,

enum class : string{
  v1 = "x", v2 = "y"
};

- Ce que je pense:

J'ai essayé de l'utiliser, mais j'ai eu des erreurs, je ne sais pas si je le fais bien ou pas. La raison pour laquelle je veux utiliser des chaînes est qu'elles sont capables de contenir plusieurs caractères en même temps, ce qui les rend plus utiles pour mon code.

6
Kourosh

Il n'y a aucun moyen de faire cela en C++ 11 ou C++ 14. Cependant, vous devriez envisager d'avoir quelques enum class , puis codez des fonctions explicites ou des opérateurs pour les convertir de et en std::string- s.

Il existe une classe dans C++ 11 appelée classe enum dans laquelle vous pouvez stocker des variables. 

Ce phrasé n'est pas correct: une classe d'énumération ne stocke pas les variables (mais les énumérateurs).

Donc, vous pourriez coder:

enum class MyEnum : char {
   v1 = 'x', v2 = 'y'
};

(Ceci est possible, comme avec druckermanly , parce que char est un type intégral; bien sûr, vous ne pouvez pas utiliser de chaînes à la place)

puis définissez une fonction MyEnum string_to_MyEnum(const std::string&); (il y aurait probablement une exception si l'argument est une chaîne inattendue) et une autre std::string MyEnum_to_string(MyEnum);. Vous pourriez même envisager de les appeler opérateur de diffusion (mais je ne trouve pas cela lisible, dans votre cas). Vous pouvez également définir un class MyEnumValue contenant un seul membre de données de type MyEnum et faire en sorte que cette classe ait opérateur de conversion , par exemple.

 class MyEnumValue {
    const MyEnum en;
 public:
    MyEnumValue(MyEnum e) : en(e) {};
    MyEnumValue(const std::string&s)
     : MyEnumValue(string_to_MyEnum(s)) {};
    operator std::string () const { return MyEnum_to_string(en);};
    operator MyEnum () const { return en };
    //// etc....
 };

Avec plus d'éléments appropriés dans MyEnumValue (voir la règle de cinq ), vous pouvez presque toujours utiliser MyEnumValue au lieu de MyEnum (qui pourrait même être interne à class MyEnumValue)

6

Non, ce n'est pas possible.

http://fr.cppreference.com/w/cpp/language/enum stipule:

Les valeurs des constantes sont des valeurs d'un type entier appelé type sous-jacent de l'énumération.

Le point clé étant "type intégral" - une chaîne n'est pas un type intégral.

2
druckermanly

Le compilateur convertit en interne votre caractère en sa représentation int équivalente (ASCII). Donc, il ne serait pas possible d'utiliser une chaîne à la place.

0
stanleyli