[C++] Un enum de string ? [Résolu]

Mandras 10 Messages postés dimanche 9 novembre 2008Date d'inscription 1 novembre 2015 Dernière intervention - 21 juil. 2013 à 22:36 - Dernière réponse : CptPingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention
- 22 juil. 2013 à 10:52
Bonjour,

Voila, un probleme assez simple de comprehension mais j'admet etre carrement bloque !

J'ai un enum qui possede de nombreuses lignes, voila un exemple :

enum {SIG1, SIG2, SIG3, ...};


Jusque la ok !

Sauf que, chaque ligne de cet enum determine en fait un signal client / server (donc tres important)
Et il y a une bonne cinquantaine de signaux differents.

Maintenant j'aimerai loguer ces signaux (donc ecriture dans un fichier de log)

Vous admettrez que, je ne peu pas loguer :
receive signal: 21

Il est preferable de loguer par exemple :
receive signal: SIG1


( Bon certe SIG1 c'est pas plus parlant mais la c'est un exemple )

Alors voila, la question est simple : COMMENT FAIRE ?

Sachant que je veu un truc propre, si possible avec une seule instantiation ... par exemple :

enum {
  SIG1 = "SIG1",
  SIG2 = "SIG2",
  SIG3 = "SIG3",
  ...
};


Mais bien-sur ce type d'enum n'existe pas.


J'ai regarde du cote d'un map et ca va pas pour 2 raisons :

1 - Obliger d' instancier l'enum et la map separement (donc tres laid pour 50+ signaux) :

enum {SIG1, SIG2, SIG3, ...};

map[SIG1] = "SIG1";
map[SIG2] = "SIG2";
...


2 - Doit etre fais dans une fonction ... hors, je souhaiterai l'instantier (ou plutot le definir) dans un fichier header (.hpp) !

Voila !

Si vous avez la reponse je vous remercie d'avance ... car je suis totalement bloque et je commence a saturer sur ce probleme la !

PS : pardonnez le manque total d'accent, je suis sur un clavier USA.
PPS : Si vous avez la solution pour un char * au lieu d'une string je suis preneur


Merci d'avance
Afficher la suite 

2 réponses

Répondre au sujet
Utilisateur anonyme - 22 juil. 2013 à 09:09
0
Utile
Hello,
Je ne pense pas que tu puisses faire autrement qu'avoir un enum et une map (ou autre collection). Par contre, tu n'es pas obligé "d'utiliser une fonction", tu peux très bien l'initialiser de manière statique, toutes les données étant connues au compil time


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de Utilisateur anonyme
CptPingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 22 juil. 2013 à 10:52
0
Utile
Bonjour.

C'est indirectement possible sans instancier quoi que ce soit. Il y a deux solutions, les deux sont "moches" :p.

1) Exemple 1 (pas d'instanciation nécessaire, tout en dur, mais deux recopies):


enum signal { SIG1 = 0, SIG2, SIG3};
static const char* strSignal = {"SIG1", "SIG2", "SIG3"};

strSignal[SIG1]; // Donne "SIG1"


3) Exemple 2: http://www.codeproject.com/Articles/10500/Converting-C-enums-to-strings
Dans cet exemple, il met un enum par fichier. Le fichier est inclus deux fois. Une fois pour créer l'enum, une fois pour créer les string associés. Au final, c'est exactement la même chose que mon exemple 1, mais en plus générique. À utiliser si tu as plus d'un enum dans ton code de ce genre. Sinon l'exemple 1 est plus adapté.

Ce qui donnera pour toi:

signal.hh
#if ( !defined(SIGNAL_HH) || defined(GENERATE_ENUM_STRINGS) )

#if (!defined(GENERATE_ENUM_STRINGS))
    #define SIGNAL_HH
#endif

#include "EnumToString.h"

BEGIN_ENUM(Signal)
{
    DECL_ENUM_ELEMENT(SIG1),
    DECL_ENUM_ELEMENT(SIG2),
    DECL_ENUM_ELEMENT(SIG3)
}
END_ENUM(Signal)


main.cc
#include 

#undef GENERATE_ENUM_STRINGS
#include "signal.hh"
#define GENERATE_ENUM_STRINGS
#include "signal.hh"
#undef GENERATE_ENUM_STRINGS

int main()
{
  Signal signal  = SIG2;
  std::cout << SIG2 << " " << GetStringSignal(signal) << std::endl;

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de CptPingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.