Heim >Backend-Entwicklung >C++ >Wie rufe ich Enum-Werte als Text in C ab?
Aufzählungswerte als Text in C abrufen
In C besteht das Standardverhalten beim Drucken von Aufzählungen darin, ihre numerischen Werte auszugeben. Es gibt jedoch Situationen, in denen es wünschenswert ist, die Textdarstellung eines Enum-Werts abzurufen.
Lösungen ohne if/switch:
Verwendung einer Karte:
#include <map> #include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; std::ostream& operator<<(std::ostream& out, const Errors value) { static const auto strings = []() { std::map<Errors, std::string_view> result; #define INSERT_ELEMENT(p) result.emplace(p, #p); INSERT_ELEMENT(ErrorA); INSERT_ELEMENT(ErrorB); INSERT_ELEMENT(ErrorC); #undef INSERT_ELEMENT return result; }(); return out << strings[value]; }
Verwenden eines Arrays mit Linear Suche:
#include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; std::ostream& operator<<(std::ostream& out, const Errors value) { #define MAPENTRY(p) {p, #p} const struct MapEntry { Errors value; std::string_view str; } entries[] = { MAPENTRY(ErrorA), MAPENTRY(ErrorB), MAPENTRY(ErrorC), {ErrorA, 0} // Placeholder for default case }; #undef MAPENTRY const char* s = 0; for (const MapEntry* i = entries; i->str; i++) { if (i->value == value) { s = i->str; break; } } return out << s; }
Verwenden einer Switch/Case-Anweisung:
#include <string> enum Errors { ErrorA = 0, ErrorB, ErrorC }; std::ostream& operator<<(std::ostream& out, const Errors value) { return out << [value]() { #define PROCESS_VAL(p) case(p): return #p; switch (value) { PROCESS_VAL(ErrorA); PROCESS_VAL(ErrorB); PROCESS_VAL(ErrorC); } #undef PROCESS_VAL }(); }
Testfall:
#include <iostream> int main() { std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC; return 0; }
Das obige ist der detaillierte Inhalt vonWie rufe ich Enum-Werte als Text in C ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!