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

SL & STL C++ Discussion :

[STL] mapper avec des enum


Sujet :

SL & STL C++

  1. #1
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut [STL] mapper avec des enum
    Bonjour, derriere un titre aussi abscons vous devez vous demander ce que je veux faire.


    version courte :
    J'ai un enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static enum StringValue { evVal1=1,
                              evVal2,
                              evXYZ,
                              evcoincoin,
                              evbidule };
    J'ai aussi des des strings (pour l'instant c'est dans un tableau...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string trucs[5]={"val1","autre","xyz","panpan","pouet"};
    Et j'aimerai bien faire un "map" de ces chaines avec mon enum, sans avoir a me pallucher à la main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_mapStringValues[trucs[2]] = evXYZ;
    Voilà... si vous avez une idée. (pour l'instant il n'y a que 5 val dans mon example, mais il y en aura plus)

    Version longue :

    Pour ceux que ca interresse, je suis en train de chercher comment faire des switch avec des std::string.
    J'ai trouvé ce lien qui est pas mal : http://www.codeguru.com/Cpp/Cpp/cpp_...icle.php/c4067
    Mais je n'aime pas du tout comment ils initialisent leur map, et c'est pour cela que je cherche une manière moins bourrin pour initialiser le map.
    sinon le fonctionnement à l'air simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static std::map<std::string, StringValue> s_mapStringValues;
    // initialisation...
    s_mapStringValues[trucs[2]] = evXYZ // etc..
    switch(s_mapStringValues[une_string])
     {
       case evXYZ : // et voilà...
       break;
     }
    Merci.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Tu peux peut-être regarder du côté de boost.assign et plus particulièrement list_of.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        std::map< std::string, EnumValue > s_mapStringValues =
            boost::assign::list_of< std::pair< std::string, EnumValue > >
                ( "val1", evVal1 )
                ( "val2", evVal2 )
                ( ... ) );
    Je ne sais pas si c'est tellement mieux en fait mais bon...

    MAT.

  3. #3
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Mat007
    Salut,

    Tu peux peut-être regarder du côté de boost.assign et plus particulièrement list_of.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        std::map< std::string, EnumValue > s_mapStringValues =
            boost::assign::list_of< std::pair< std::string, EnumValue > >
                ( "val1", evVal1 )
                ( "val2", evVal2 )
                ( ... ) );
    Je ne sais pas si c'est tellement mieux en fait mais bon...

    MAT.
    Merci mais j'aimerai éviter d'ajouter une dépendance de librairie.
    il n'y a pas un autre moyen ?
    ca serait bien s'il y avait un iterator sur l'enum...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_mapStringValues[trucs[iterator_de_lenum]] = iterator_de_lenum;
    et faire en sorte que l'iterator commence a evVal1 jusqu'a evBidule...


    PS : pour ceux qui comme moi ont des warnings (C4786) avec VC6 et les map, c'est un bug connu (180 warning quand même, hein) qui se corrige par un "#pragma warning (disable : 4786)" avant le "#include <map>". voilà.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Sinon y'a l'astuce classique d'utiliser la valeur du dernier éléments de l'énumération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum StringValue { evVal1=1,
                              evVal2,
                              evXYZ,
                              evcoincoin,
                              evbidule,
                              evSize };
    for( int i = 1; i < evSize; ++i )
        s_mapStringValues[trucs[i-1]] = i;
    MAT.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par hpfx
    PS : pour ceux qui comme moi ont des warnings (C4786) avec VC6 et les map, c'est un bug connu (180 warning quand même, hein) qui se corrige par un "#pragma warning (disable : 4786)" avant le "#include <map>". voilà.
    Oui enfin ça ne corrige rien, ça désactive juste le 'warning', et en plus ça le désactive pour toute l'unité de compilation et pas juste pour le code incriminé.
    Donc si ton 'pragma' se trouve dans un .h il a effet dans tous les .cpp qui l'incluent, directement ou non...

    En général je fais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #pragma warning( push, 0 )
    #    include <map>
    #pragma warning( pop )
    Ce qui a pour effet de passer temporairement le niveau de warnings a 0.

    MAT.

  6. #6
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Mat007
    Sinon y'a l'astuce classique d'utiliser la valeur du dernier éléments de l'énumération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum StringValue { evVal1=1,
                              evVal2,
                              evXYZ,
                              evcoincoin,
                              evbidule,
                              evSize };
    for( int i = 1; i < evSize; ++i )
        s_mapStringValues[trucs[i-1]] = i;
    MAT.
    ha ben voilà, c'est nickel ca... sauf que qu'il ne veux pas me convertir un "int" en "enum StringValue" (C2440).
    et là il me dit
    Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
    et je ne sais pas quoi faire, quel type de cast ? quelle syntaxe ? (j'ai jamais compris la difference entre tous ces cast d'ailleur).
    Bref.. que faire ?

    Ps : merci pour ton truc de warning. autrement mon pragma n'etait pas dans un .h heureusement

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    J'ai mis l'int un peu au pif (ça fait des années que j'ai pas eu recours à ça), essaye avec différents types pour voir (short, unsigned int, StringValue) ?
    Y'a moyen de faire ça sans transtypage je pense...

    edit : bizarre sous msvc8 les types numériques fonctionnent, par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        enum Pipo { p1, p2, size };
        for( int p = 1; p < size; ++p )
            ;
    MAT.

  8. #8
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Mat007
    J'ai mis l'int un peu au pif (ça fait des années que j'ai pas eu recours à ça), essaye avec différents types pour voir (short, unsigned int, StringValue) ?
    Y'a moyen de faire ça sans transtypage je pense...

    edit : bizarre sous msvc8 les types numériques fonctionnent, par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        enum Pipo { p1, p2, size };
        for( int p = 1; p < size; ++p )
            ;
    MAT.
    bah, ben moi j'ai du caster.. à l'ancienne (au temps du C) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        s_mapStringValues[trucs[i-1]] = (enum StringValue )i;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mapper une association many to many avec des attributs
    Par deli_devellopez dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 10/05/2013, 21h25
  2. Des enums avec des tirets
    Par thierryler dans le forum JPA
    Réponses: 6
    Dernier message: 28/08/2012, 10h42
  3. [XSD] Mapper intelligemment un XSD avec des Objets Java
    Par PoteA_Tooz dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 09/05/2008, 10h33
  4. Comment gérer des sous ensembles avec des "enum" ?
    Par ogattaz dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2007, 10h29
  5. enum avec des long
    Par gnto dans le forum C
    Réponses: 5
    Dernier message: 15/05/2006, 12h45

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