Affichage type enum

Affichage type enum

by Roman Eugène Michel Stemplowski -
Number of replies: 2

Bonjour,

J'ai dans un exercice un type énuméré dont j'aimerais pouvoir afficher les valeurs comme des strings. En effet, le code

enum T { A, B, C, D };

cout << A << " " << B << endl;

donne la sortie suivante : '0 1'.

Pour afficher 'A B' j'ai donc pensé à déclarer une variable globale const array<string, 4> c = { "A", "B", "C", "D" };  pour pouvoir utiliser comme suit :

cout << c[A] << " " << c[B] << endl;

qui me fourni le résultat souhaité. L’inconvénient de cette méthode est qu'elle utilise une variable globale et dans le mooc il a été répété plusieurs fois que c'était mauvais. Une utilisation dans un cas comme celui ci est-elle excusable ou les variables globales sont à fuir inconditionnellement ? Si tel est le cas, comment peut-on remplacer ce système ? Je trouve qu'utiliser un switch / case pour cela est peu élégant et assez lourd.

(PS : constexpr array<string, 4> c = { "A", "B", "C", "D" }; ne fonctionne pas, j'ai le message d'erreur suivant : "the type 'const std::array<std::__cxx11::basic_string<char>, 5>' of constexpr variable 'c' is not literal". Si quelqu'un a une explication...)


Merci pour votre aide

In reply to Roman Eugène Michel Stemplowski

Re: Affichage type enum

by Jean-Cédric Chappelier -

C'est une question intéressante (un peu hors du programme de l'examen de lundi ; pour info : les enum ont été présenté(e?)s dans la semaine 8 (étude de cas) du premier semestre, première vidéo (celle du jeu de Puissance 4)).

au niveau de ce cours : oui on pourrait tolérer une telle variable globale const.
Mais il y a mieux...

Tout d'abord ce que vous voulez faire c'est afficher avec << : donc pourquoi ne pas surcharger operator<< pour votre enum ?
Ainsi, à cet endroit et à cet endroit seulement vous pourriez définir votre association, sous forme d'un tableau si vous préférez (c'est votre choix) ou sous forme d'un switch (qui va très bien aussi). Ce ne serait donc plus une variable globale.

Enfin, totalement hors du cours mais juste pour info : si il y a un  « pattern » assez régulier pour l'affichage des valeurs de l'enum, on pourrait utiliser les macros du précompilateur C pour écrire le code à notre place ; par exemple :

enum A { XXX, YYY };

#define CASE(X)   case X: out << #X; break

ostream& operator<<(ostream& out, A const& a)
{
  switch(a) {
    CASE(XXX);
    CASE(YYY);
  default: out << "inconnue"; break;
  }
  return out;
}

Si vous souhaitez en savoir plus sur le précompilateur C, il y a cette vidéo de mon cours de C aux IN (à ne regarder qu'après l'examen de lundi !!! ;-) ) : https://drive.switch.ch/index.php/s/A1pkhOHijJF9uUY

ah et pour votre question de fin : c'est parce que std::string n'est pas un type littéral (mais une classe). Ce sera possible en C++20. En C++17 c'est possible (constexpr) avec une string_view ; et sinon (avant C++17) il faut mettre un const au lieu du constexpr.
In reply to Jean-Cédric Chappelier

Re: Affichage type enum

by Roman Eugène Michel Stemplowski -

Bonjour,

Merci pour cette réponse rapide et complète.

"pourquoi ne pas surcharger operator<< pour votre enum ?" : tout simplement parce que j'ignorais que cela était possible.

"Si vous souhaitez en savoir plus sur le précompilateur C, il y a cette vidéo de mon cours de C aux IN (à ne regarder qu'après l'examen de lundi !!! ;-) ) : https://drive.switch.ch/index.php/s/A1pkhOHijJF9uUY" : merci beaucoup, je garde donc cela pour lundi après midi.

Cordialement