wake-up-neo.net

C++ - String zur Enumeration

Gibt es eine einfache Möglichkeit in C++, eine Zeichenfolge in eine Enumeration zu konvertieren (ähnlich wie Enum.Parse in C #)? Eine switch-Anweisung wäre sehr long, also habe ich mich gefragt, ob es einen einfacheren Weg gibt, dies zu tun?

BEARBEITEN:

Vielen Dank für Ihre Antworten. Mir wurde klar, dass es für meinen speziellen Fall einen viel einfacheren Weg gibt. Die Saiten enthielten immer das Zeichen 'S' gefolgt von einer Nummer, also tat ich es

int i = atoi(myStr.c_str() + 1);

und machte dann einen Schalter auf i.

15
Daniel

Ein std::map<std::string, MyEnum> (oder unordered_map) könnte dies problemlos tun. Das Auffüllen der Karte wäre jedoch genauso langweilig wie die switch-Anweisung.

26
Mark Ransom

Verwenden Sie std::map<std::string, Enum> und verwenden Sie boost::map_list_of , um leicht zu initialisieren.

Beispiel,

enum X
{
   A,
   B,
   C
};

std::map<std::string, X> xmap = boost::map_list_of("A", A)("B", B)("C",C);
23
Nawaz

sah dieses Beispiel irgendwo

#include <map>
#include <string>

enum responseHeaders
{
    CONTENT_ENCODING,
    CONTENT_LENGTH,
    TRANSFER_ENCODING,
};

// String switch paridgam   
struct responseHeaderMap : public std::map<std::string, responseHeaders>
{
    responseHeaderMap()
    {
        this->operator[]("content-encoding") =  CONTENT_ENCODING;
        this->operator[]("content-length") = CONTENT_LENGTH;
        this->operator[]("transfer-encoding") = TRANSFER_ENCODING;
    };
    ~responseHeaderMap(){}
};
10
Guy L

Ich benutze diese "Tricks"> http://codeproject.com/Articles/42035/Enum-to-String-and-Vice-Versa-in-C

Nach dem

enum FORM {
    F_NONE = 0,
    F_BOX,
    F_CUBE,
    F_SPHERE,
};

einfügen

Begin_Enum_String( FORM )
{
    Enum_String( F_NONE );
    Enum_String( F_BOX );
    Enum_String( F_CUBE );
    Enum_String( F_SPHERE );
}
End_Enum_String;

Funktionieren Sie gut, wenn die Werte in enum nicht überlagert sind.

Beispiel im Code

enum FORM f = ...
const std::string& str = EnumString< FORM >::From( f );

und umgekehrt

assert( EnumString< FORM >::To( f, str ) );
8

Es gibt keine "eingebaute Methode", aber es gibt Möglichkeiten, dies durch Speichern des Paarwertnamens in einem Array zu erreichen

enum myEnum
{
    enumItem0,
    enumItem1,
    enumItem7 = 7,
    enumItem8
};

std::vector<std::pair<myEnum,std::string>>   gMap;

#define ADDITEM(x)  gMap.Push_back(std::pair<myEnum,std::string>(x,#x));

.....

ADDITEM(enumItem0);
ADDITEM(enumItem1);
ADDITEM(enumItem7);
ADDITEM(enumItem8);
5
cprogrammer

Sie können Makro verwenden, um die Wiederholung zu minimieren. Hier ist der Trick: Enums, Makros, Unicode und Token-Einfügen

2
jj1

Kurzum: es gibt keine. In C++ sind Enums statische Werte und keine Objekte wie in C #. Ich schlage vor, dass Sie eine Funktion mit einigen if else-Anweisungen verwenden.

2
Constantinius

Es gibt zwar keine direkte Lösung, es gibt jedoch einige mögliche Problemumgehungen.

Sehen Sie sich diese Frage an: Einfache Möglichkeit, Variablen von Aufzählungstypen als Zeichenfolge in C zu verwenden.

1
TeaWolf

das hat für mich funktioniert: 

enum NODES { Cone = 1, BaseColor = 2, NONE = 0 };

std::map<std::string, NODES> nodeMap;
nodeMap["Cone"] = NODES::Cone;
nodeMap["BaseColor"] = NODES::BaseColor;
1
Elias

Dies ist nicht möglich, da die Namen zur Laufzeit nicht verfügbar sind. Während der Kompilierung wird jede Aufzählung durch den entsprechenden ganzzahligen Wert ersetzt.

1

"Zusätzliche Frage: Ist es möglich, undefinierte Zeichenfolgen zu handhaben? Ich meine, wenn ich versuche, den Wert für responseHeaderMap [" cookie "] zu erhalten, wie lautet der Wert? (Sofern in den responseHeaderMap - barts nicht" cookie "definiert ist) 22. November '16 um 12:04 "

nun, Sie können einfach überprüfen, bevor:

auto it = responseHeaderMap.find("cookie");
if (it != responseHeaderMap.end())
{
     // "cookie" exist, can take value 
}

Nach der Prüfung des "Cookies" können Sie den Wert mit use ermitteln:

responseHeaderMap["cookie"]

ich hoffe das hilft

Nein, Sie müssen eine Wenn/Dann-Konstruktion verwenden oder eine Map- oder Hash-Tabelle oder eine andere Art von assoziativer Datenstruktur verwenden, um dies zu erleichtern.

0
mwigdahl