72 votes

Enum en String C++

Je trouve souvent que j'ai besoin de convertir une énumération en chaîne de caractères en c++

Je finis toujours par faire:

enum Enum{ Banana, Orange, Apple } ;

char * getTextForEnum( int enumVal )
{
  switch( enumVal )
  {
  case Enum::Banana:
    return "bananes et singes";
  case Enum::Orange:
    return "Rond et orange";
  case Enum::Apple:
    return "POMME";

  default:
    return "Non reconnu..";
  }
}

Y a-t-il un meilleur ou un idiome reconnu pour faire cela?

2 votes

Peut-être utiliser std::map au lieu de l'énumération et du switch? Avec un peu d'encapsulation dans un objet, vous pourriez le rendre suffisamment intelligent pour être réutilisable en tant que recherche de code d'erreur et gestionnaire pour toutes vos applications.

5 votes

Une amélioration consiste à ne pas inclure la clause 'default:' tout en augmentant le niveau d'avertissement de votre compilateur et en traitant les avertissements comme des erreurs. De cette façon, si vous étendez un jour la liste des énumérations, le compilateur vous avertira et échouera sur votre déclaration switch, vous rappelant d'étendre également le switch. Certaines personnes disent que vous devriez toujours avoir une valeur par défaut, mais je pense que c'est un scénario où le manque de celle-ci peut en fait vous aider.

53voto

Mark Ransom Points 132545
enum Enum{ Banane, Orange, Pomme } ;
static const char * EnumStrings[] = { "bananes & singes", "Rond et orange", "POMME" };

const char * getTextForEnum( int enumVal )
{
  return EnumStrings[enumVal];
}

29 votes

Fonctionne uniquement pour les énumérations continues.

3 votes

@SasQ, J'ai une réponse plus détaillée ici : stackoverflow.com/a/11586083/5987 Beaucoup d'autres bonnes suggestions dans ce fil de discussion aussi.

0 votes

Un meilleur prototype serait const char *getTextForEnum(int) const; mon ami. Meilleure pratique.

23voto

Blagovest Buyukliev Points 22767

Sorte de table de recherche anonyme plutôt qu'une longue déclaration switch :

return (const char *[]) {
    "bananes et singes",
    "Rond et orange",
    "POMME",
}[enumVal];

14voto

nathan Points 2771

Vous pourriez jeter la valeur d'énumération et la chaîne de caractères dans une map STL. Ensuite, vous pourriez l'utiliser comme ceci.

   return myStringMap[Enum::Apple];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X