- Informations générales:

Il existe une classe en C ++ 11 connue sous le nom de classe enum dans laquelle vous pouvez stocker des variables. Cependant, je n'ai vu que le type de la classe être char:

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

- Question:

Existe-t-il un moyen d'exprimer cette classe enum de type string?

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 correctement ou pas. La raison pour laquelle je souhaite 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.

10
Kourosh 20 avril 2017 à 08:04

3 réponses

Meilleure réponse

Il n'y a aucun moyen de faire cela en C ++ 11 ou C ++ 14. Cependant, vous devriez envisager d'avoir une classe enum, puis coder certaines fonctions ou opérateurs explicites pour le convertir de et en std::string - s.

Il existe une classe en C ++ 11 connue sous le nom de classe enum dans laquelle vous pouvez stocker des variables.

Ce libellé n'est pas correct: une classe enum ne stocke pas de variables (mais des énumérateurs ).

Vous pouvez donc coder:

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

(cela est possible, car répondu par druckermanly, car 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&); (elle lèverait 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 demander à un opérateur de cast de les appeler (mais je ne trouvez cela lisible, dans votre cas). Vous pouvez également définir un class MyEnumValue contenant un seul membre de données de type MyEnum et avoir cette classe ayant opérateur de cast, 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 de choses appropriées dans MyEnumValue (voir la règle de cinq) vous pouvez presque toujours utiliser MyEnumValue au lieu de MyEnum (qui peut même être interne à class MyEnumValue)

6
Community 23 mai 2017 à 12:25

Non, ce n'est pas possible.

http://en.cppreference.com/w/cpp/language/enum déclare:

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

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

3
druckermanly 20 avril 2017 à 05:09

Le compilateur convertit en interne votre char en sa représentation int équivalente (ASCII). Il ne serait donc pas possible d'utiliser une chaîne à la place.

0
stanleyli 20 avril 2017 à 05:10