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.
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.
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);
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(){}
};
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 ) );
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);
Sie können Makro verwenden, um die Wiederholung zu minimieren. Hier ist der Trick: Enums, Makros, Unicode und Token-Einfügen
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.
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.
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;
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.
"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.