Heim >Backend-Entwicklung >C++ >Wie drucke ich C-Enum-Werte als Text, ohne if/switch-Anweisungen zu verwenden?
In C bieten Enums eine praktische Möglichkeit, einen Satz benannter Konstanten darzustellen. Beim Drucken eines Aufzählungswerts besteht das Standardverhalten jedoch darin, seine numerische Darstellung anzuzeigen.
Angenommen, wir haben eine Aufzählung wie diese:
enum Errors { ErrorA = 0, ErrorB, ErrorC, };
Wenn wir versuchen, einen Aufzählungswert mit zu drucken std::cout:
Errors anError = ErrorA; std::cout << anError; // 0 will be printed
Wir erhalten den numerischen Wert 0 anstelle der Textdarstellung „ErrorA“. Dieses Problem tritt auf, weil std::cout keine integrierte Unterstützung für die Konvertierung von Aufzählungen in Zeichenfolgen bietet.
1. Verwenden einer Karte
Ein Ansatz besteht darin, eine Karte zu erstellen, die jeden Enum-Wert mit seiner Textdarstellung verknüpft:
#include <map> #include <string_view> 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]; }
2. Verwenden eines Arrays von Strukturen mit linearer Suche
Eine andere Möglichkeit besteht darin, ein Array von Strukturen zu verwenden, die jeweils einen Enum-Wert und seine Textdarstellung enthalten, und dann eine lineare Suche durchzuführen:
#include <string_view> 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} //doesn't matter what is used instead of ErrorA here... }; #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; }
3. Verwendung von switch/case
Schließlich können wir auch eine switch/case-Anweisung verwenden:
#include <string> 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 }; }
Testen der Lösungen:
Um diese Lösungen zu testen, können wir eine ausführbare Datei mit dem folgenden Code erstellen:
#include <iostream> int main(int argc, char** argv) { std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl; return 0; }
Das Ausführen dieser ausführbaren Datei sollte eine Ausgabe ergeben die Textdarstellungen der Enum-Werte:
ErrorA ErrorB ErrorC
Das obige ist der detaillierte Inhalt vonWie drucke ich C-Enum-Werte als Text, ohne if/switch-Anweisungen zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!