C ++ string a enum

C’è un modo semplice in C ++ per convertire una stringa in un enum (simile a Enum.Parse in C #)? Un’istruzione switch sarebbe molto lunga, quindi mi chiedevo se c’è un modo più semplice per farlo?

MODIFICARE:

Grazie per tutte le vostre risposte. Mi sono reso conto che c’era un modo molto più semplice per farlo per il mio caso particolare. Le stringhe contenevano sempre il carattere “S” seguito da un numero, così ho fatto

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

e poi ha fatto un passaggio su i.

Una std::map (o std::map ) potrebbe farlo facilmente. La compilazione della mappa sarebbe altrettanto noiosa dell’istruzione switch.

Usa std::map e usa boost::map_list_of per inizializzarlo facilmente .

Esempio,

 enum X { A, B, C }; std::map xmap = boost::map_list_of("A", A)("B", B)("C",C); 

ho visto questo esempio da qualche parte

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

Uso questi “trucchi”> http://codeproject.com/Articles/42035/Enum-to-String-and-Vice-Versa-in-C

Dopo

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

inserire

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

Funziona bene, se i valori in enum non sono pubblici.

Esempio nel codice

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

vice versa

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

Non esiste un “modo integrato”, ma ci sono modi per ottenere ciò memorizzando la coppia nome-valore in una matrice

 enum myEnum { enumItem0, enumItem1, enumItem7 = 7, enumItem8 }; std::vector> gMap; #define ADDITEM(x) gMap.push_back(std::pair(x,#x)); 

…..

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

In breve: non c’è nessuno. Le enumerazioni in C ++ sono valori statici e non oggetti come in C #. Ti suggerisco di utilizzare una funzione con alcune istruzioni if else .

Puoi usare la macro per minimizzare il ripetersi. Ecco il trucco: Enums, Macro, Unicode e Token-Pasting

Non è ansible perché i nomi non sono disponibili in fase di runtime. Durante la compilazione ogni enum viene sostituito con il valore intero corrispondente.

Mentre non esiste una soluzione diretta, ci sono alcuni possibili soluzioni alternative.

Dai un’occhiata a questa domanda: Un modo semplice per usare le variabili dei tipi enum come stringa in C?

No, dovrai usare una costruzione if / then o usare una mappa o tabella hash o qualche altro tipo di struttura dati associativa per facilitare questo.

questo ha funzionato per me:

 enum NODES { Cone = 1, BaseColor = 2, NONE = 0 }; std::map nodeMap; nodeMap["Cone"] = NODES::Cone; nodeMap["BaseColor"] = NODES::BaseColor; 

“Domanda aggiuntiva: è ansible gestire stringhe non definite? Voglio dire se provo a ottenere il valore di responseHeaderMap [” cookie “], quale sarà il valore? (A condizione che” cookie “non sia definito in responseHeaderMap – bart s 22 novembre 16 alle 12:04 ”

bene, puoi semplicemente controllare prima:

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

Dopo la verifica di “cookie”, puoi ottenerne il valore con l’uso:

 responseHeaderMap["cookie"] 

spero che questo aiuto