Heim >Backend-Entwicklung >C++ >Wie kann ich C-Enum-Werte als Text drucken, ohne if/switch-Anweisungen zu verwenden?
Aufzählungswerte als Text ohne if/switch in C drucken
In C bieten Aufzählungen eine Möglichkeit, symbolischen Namen ganzzahlige Werte zuzuweisen. Beim Drucken eines Enum-Werts auf der Konsole wird jedoch normalerweise die zugehörige Ganzzahl anstelle des symbolischen Namens ausgegeben.
Um diese Einschränkung zu überwinden und Enum-Werte als Text zu drucken, untersuchen wir drei effiziente Lösungen:
1. Verwenden einer Karte:
Die Verwendung einer std::map ermöglicht eine effiziente Suche von Enum-Werten in ihren entsprechenden Textdarstellungen.
#include <map> #include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; // Custom insertion function for map #define INSERT_ELEMENT(p) result.emplace(p, #p); // Initialize the map static const auto strings = []() { std::map<Errors, std::string_view> result; INSERT_ELEMENT(ErrorA); INSERT_ELEMENT(ErrorB); INSERT_ELEMENT(ErrorC); return result; }; std::ostream& operator<<(std::ostream& out, const Errors value) { return out << strings[value]; }
2. Verwenden eines Arrays von Strukturen mit linearer Suche:
Bei diesem Ansatz wird ein Array von Strukturen erstellt, von denen jede einen Aufzählungswert und den entsprechenden Text enthält. Anschließend wird die lineare Suche verwendet, um den Text für den gewünschten Enum-Wert abzurufen.
#include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; // Structure for mapping enum to text struct MapEntry { Errors value; std::string_view str; }; std::ostream& operator<<(std::ostream& out, const Errors value) { const MapEntry entries[] = { {ErrorA, "ErrorA"}, {ErrorB, "ErrorB"}, {ErrorC, "ErrorC"} }; const char* s = nullptr; for (const MapEntry* i = entries; i->str; i++) { if (i->value == value) { s = i->str; break; } } return out << s; }
3. Verwendung von switch/case:
Obwohl es weniger effizient als der Map-Ansatz ist, kann switch/case auch zum Zuordnen von Enum-Werten zu Text verwendet werden.
#include <string> enum Errors { ErrorA = 0, ErrorB, ErrorC }; std::ostream& operator<<(std::ostream& out, const Errors value) { return out << [value]() { switch (value) { case ErrorA: return "ErrorA"; case ErrorB: return "ErrorB"; case ErrorC: return "ErrorC"; } }; }
Das obige ist der detaillierte Inhalt vonWie kann ich C-Enum-Werte als Text drucken, ohne if/switch-Anweisungen zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!