Bezeichnungen der Integers einer Enumeration erhalten



  • Hallo,

    ich habe eine Enumeration

    enum Nds_Left { NONE_LEFT, FIRST_LEFT, SECOND_LEFT, THIRD_LEFT, ALL_LEFT, FIRST_TWO_LEFT };
    

    Gibt es dann eine Möglichkeit, die Zuordnung (eines Integers zu einem String)

    0 -> "NONE_LEFT"
    1 -> "FIRST_LEFT"
    ...
    5 -> "FIRST_TWO_LEFT"

    zu erhalten?



  • nein, eine in die sprache eingebaute lösung gibt es nicht.



  • Das kannst du ganz gut mit einer std::map machen.

    #include <map>
    ...
    std::map<unsigned int , std::string> enums;
    enums.insert (std::pair<int,std::string> ( 0 , "NONE_LEFT" ));
    enums.insert (std::pair<int,std::string> ( 1 , "FIRST_LEFT" " ));
    ...
    
    std::cout << enums[ 0 ];
    

  • Administrator

    drakon schrieb:

    #include <map>
    ...
    std::map<unsigned int , std::string> enums;
    enums.insert (std::pair<int,std::string> ( 0 , "NONE_LEFT" ));
    enums.insert (std::pair<int,std::string> ( 1 , "FIRST_LEFT" " ));
    ...
    	
    std::cout << enums[ 0 ];
    

    Ein wenig komplex der Code ... mach das doch einfacher:

    #include <map>
    // ...
    enum Nds_Left { NONE_LEFT, FIRST_LEFT, SECOND_LEFT, THIRD_LEFT, ALL_LEFT, FIRST_TWO_LEFT };
    // ...
    std::map<Nds_Left, std::string> enums;
    enums[NONE_LEFT]  = "NONE_LEFT";
    enums[FIRST_LEFT] = "FIRST_LEFT";
    // ...
    
    std::cout << enums[NONE_LEFT];
    

    Also die ganzen insert mit den std::pair , wo du nicht einmal std::make_pair verwendest, sind nicht nötig. Der operator [] legt automatisch ein neues Objekt an, wenn es nicht vorhanden ist.

    Man könnte es übrigens auch über einen std::vector lösen, sofern die Enumeration bei 0 beginnt und fortlaufend ist:

    #include <vector>
    // ...
    enum Nds_Left { NONE_LEFT = 0, FIRST_LEFT, SECOND_LEFT, THIRD_LEFT, ALL_LEFT, FIRST_TWO_LEFT };
    // ...
    std::vector<std::string> enums;
    enums.push_back("NONE_LEFT");
    enums.push_back("FIRST_LEFT");
    // ...
    
    std::cout << enums[NONE_LEFT];
    

    Grüssli



  • const char* Nds_Left[] = { "NONE_LEFT", "FIRST_LEFT", "SECOND_LEFT", "THIRD_LEFT", "ALL_LEFT", "FIRST_TWO_LEFT" };
    std::map<unsigned int , std::string> enums;
    for ( unsigned int i=0; i<sizeof(Nds_Left)/sizeof(*Nds_Left); ++i )
        enums[i] = Nds_Left[i];
    

    ?



  • Dravere schrieb:

    enums[NONE_LEFT]  = "NONE_LEFT"; 
    enums[FIRST_LEFT] = "FIRST_LEFT";
    

    Sorry Dravere, ich konnte der Versuchung nicht widerstehen, es mit Makros zu erledigen. 😃

    #define INSERT_ENUM(VALUE) enums[VALUE] = #VALUE
    
    INSERT_ENUM(NONE_LEFT);
    INSERT_ENUM(FIRST_LEFT);
    


  • Dravere schrieb:

    Ein wenig komplex der Code ... mach das doch einfacher:

    Hmm. Ich habe mir zuerst eh überlegt, ob ich überhaupt ein Beispiel machen soll. Und dann ist halt das schnell draus geworden.
    Mir ist das mit dem vector auch durch den Kopf und auch das von Badestrand. Es gibt so verdammt viele Möglichkeiten das zu machen. Ich habe einfach das erstbeste genommen.;)
    (Nur das von Nexus ist mir nicht einmal durch den Kopf.. *hust* böse *hust*)


  • Administrator

    Nexus schrieb:

    Sorry Dravere, ich konnte der Versuchung nicht widerstehen, es mit Makros zu erledigen. 😃

    *seufz*
    Aber dann doch bitte so:

    #define EVIL_MACRO_WITH_PREFIX_TO_PREVENT_MALFUNCTION_INSERT_ENUM(MAP, VALUE) MAP[VALUE] = #VALUE
    
    // ...
    std::map<Nds_Left, char const*> enums;
    EVIL_MACRO_WITH_PREFIX_TO_PREVENT_MALFUNCTION_INSERT_ENUM(enums, NONE_LEFT);
    EVIL_MACRO_WITH_PREFIX_TO_PREVENT_MALFUNCTION_INSERT_ENUM(enums, FIRST_LEFT);
    

    So richtig à la Boost, dort kommen mir die Makros auch immer so vor 😉

    @Badestrand,
    Wenn die Enumeration bei 0 beginnt und fortlaufend ist, ist die Map gar nicht mehr nötig und dann wohl eine der bisher besten Lösungen 😉

    Grüssli

    Edit: Makro == Deutsch && Macro == Englisch 😃



  • auch c++ hat statische, konstante arrays. was badestrand geschrieben hat, sollte zum teil schon die lösung sein. zumindest die erste zeile reicht schon vollkommena us. map ist vollkommen nutzlos und macht euren code nur viel länger und das binary fett.



  • Das statische Array geht aber auch nur, wenn die Werte der Enumerationskonstanten schön nacheinander liegen.


Anmelden zum Antworten