IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

enum et string


Sujet :

C++

  1. #1
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut enum et string
    Je souhaite faire quelque chose comme ceci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum myenum {
    e_str1,
    e_str2,
    e_str3,
    e_end
    };
     
    const char  *mystr[e_end]={
    "str1",
    "str2",
    "str3",
    };
    ...mais en �vitant de coder tout deux fois, c-�-d de cr�er manuellement une entr�e dans mystr pour chaque enum cr��. Quand la liste d'enum s'allonge les erreurs deviennent fr�quentes. Bref, si le compilateur avait un support de ce genre se serait pas mal:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    const char *AskComplierToConvertEnumToString(myenum e_str)
    {
    return substr(charof(e_str),2,0xffffffff);
    }
    Une solution serait une g�n�rateur de code, mais bon...
    D'autres solutions ?
    Merci.

  2. #2
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Boost.Preprocessor peut te permettre de factoriser ce genre de chose :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include <boost/preprocessor.hpp>
     
    // la liste unique où positionner les différentes valeurs
    #define LISTE_CHAINES\
       (str1)\
       (str2)\
       (str3)\
       (str4)\
       (str5)\
       (str6)\
     
    // macro pour definir l'enum
    #define DEFINIR_ENUM(unused_1,unused_2,elem) BOOST_PP_CAT(e_,elem),
    // macro pour definir les chaines de caractères
    #define DEFINIR_CHAINES(unused_1,unused_2,elem) BOOST_PP_STRINGIZE(elem),
     
    // definition de l'enum
    enum myenum {
       BOOST_PP_SEQ_FOR_EACH(DEFINIR_ENUM,~,LISTE_CHAINES)
       e_end
    };
    // definition du tableau de chaines
    const char  *mystr[e_end]={
       BOOST_PP_SEQ_FOR_EACH(DEFINIR_CHAINES,~,LISTE_CHAINES)
    };
    // undef de ce dont on n'a plus besoin
    #undef DEFINIR_CHAINES
    #undef DEFINIR_ENUM
    #undef LISTE_CHAINES

  3. #3
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    J'en suis tout baba
    Avec un peu d'astuce les compilos permettent donc pas mal de choses. Les op�rateurs # et ## dans les define sont bien connus, mais la simulation de boucle for ou de code conditionnel if dans les define m'�pate (note, il semble qu'on soit limit� � 256 dans la liste, mais �a devrait suffire; s'il le faut il suffit de "compl�ter" les macros de boost).

    Mais ce qui m'�pate le plus c'est peut-�tre bien votre capacit� � r�pondre au quart de tour � une question tout de m�me tr�s sp�cialis�e (enfin, il me semble) en pointant directement sur l'outil qui r�soud le probl�me "l'air de rien".

    Merci.

  4. #4
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Bon, voil�, j'aimerais aller un peu plus loin maintenant, mais je cale. J'aimerais d�finir une structure qui serait un prototype d'un ensemble de structures qui ne seraient diff�renci�es que par LISTE_CHAINES.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    struct MonType
    {
    #define DEFINIR_ENUM(unused_1,unused_2,elem) BOOST_PP_CAT(e_,elem),
     enum myenum {
       BOOST_PP_SEQ_FOR_EACH(DEFINIR_ENUM,~,LISTE_CHAINES)
       e_end
    };
    #define DEFINIR_CHAINES(unused_1,unused_2,elem) BOOST_PP_STRINGIZE(elem),
    static const char  *mystr[e_end]={
       BOOST_PP_SEQ_FOR_EACH(DEFINIR_CHAINES,~,LISTE_CHAINES)
    };
    ...
    MonType();
    ~MonType();
    void foo1();
    void foo2();
    ...
    };
    Je ne vois pas comment templatiser cela. Exemple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    struct LesNoms
    {
     enum myenum {
       e_prenom,
       e_nom;
       e_end
    };
    static const char  *mystr[e_end]={"prenom","nom"};
    ...
    LesNoms();
    ~LesNoms();
    void foo1();
    void foo2();
    ...
    };
     
    struct LesComms
    {
     enum myenum {
       e_tel,
       e_fax;
       e_email;
       e_end
    };
    static const char  *mystr[e_end]={"tel","fax","email"};
    ...
    LesComms();
    ~LesComms();
    void foo1();
    void foo2();
    ...
    };
    J'aurais ainsi de nombreuses structures qui ne diff�rent que par myenum et mystr.

    Merci.

  5. #5
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Rien ne t'emp�che d'encha�ner les traitements dans les macros de Boost.Preprocessor (liste de liste). Cependant, � terme, cela risque de devenir assez illisible et assez ind�buggable
    Au passage, pourquoi ne pas ajouter mystr comme variable statique de MonType ? Il semblerait d'apr�s ce que tu montres qu'il soit coh�rent de les regrouper, non ?

    [EDIT] Arg,
    J'ai r�pondu � c�t�... Une piste serait probablement de sortir ton enum et ta cha�ne dans une classe trait, d'ajouter un enum pour les diff�rents types et de faire ta classe g�n�rique avec cet enum et la classe trait associ�e.

  6. #6
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Oui, mystr est static bien s�r. Le code est incomplet/imparfait/incorrect, il est l� pour illustrer ma demande.

    Donc, tu proposes une classe de traits pour chaque couple [myenum,mystr] � passer en param�tre d'un template. J'essaie �a (mais i'm faut un truc � shooter mes neurones d'abord - i'manque la tasse de caf� ou le retroussage de manches dans la liste de smiley - )

  7. #7
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Et bien voil�, magnifico, tout baigne
    Tous mes enums associ�s aux char const * sont isol�s dans des structs, des "traits" quoi !
    Ensuite j'ai une classe template qui g�re de fa�on commune tous ces traits, sauf que j'ai 2 mani�res diff�rentes de les traiter. J'ai donc cr�� deux autres template, genre "policies" avec des pr�dicats associ�s (ou plut�t des foncteurs).

    A l'instantiation j'ai un code du genre
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    	TraitementCommun< TraitementA<EnumX> > les_colonnes;
    	TraitementCommun< TraitementB<EnumY> > les_lignes;
    A l'usage �a donne (les AssignMachin sont les foncteurs)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    les_lignes.Set(id1, AssignLine<EnumY>(EnumY::e_str1, value1));
    les_colonnes.Set(id2, AssignColumn<EnumX>(EnumX::e_str2, value2, subvalue2));
    Voil�, voil� je sais, �a ne vous dit rien sans le code complet, mais je suis fier de moi quand m�me
    Encore merci !

  8. #8
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut

    Bienvenu dans le monde myst�rieux de la programmation g�n�rique

Discussions similaires

  1. R�ponses: 3
    Dernier message: 12/06/2015, 14h05
  2. Enum et String
    Par Gurdil le nain dans le forum VB.NET
    R�ponses: 8
    Dernier message: 18/04/2011, 15h57
  3. Enum de strings
    Par lasrevinu dans le forum C#
    R�ponses: 13
    Dernier message: 07/04/2010, 13h57
  4. [Java 5] Enum et String
    Par ebaynaud dans le forum Langage
    R�ponses: 8
    Dernier message: 10/01/2008, 17h09
  5. un enum de string
    Par dalio2579 dans le forum C#
    R�ponses: 6
    Dernier message: 15/05/2007, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo