在C 中不使用if/switch 將枚舉值列印為文字
在C 中,枚舉提供了一種將整數值指派給符號名稱的方法。但是,當將枚舉值列印到控制台時,它通常會輸出關聯的整數而不是符號名稱。
為了克服此限制並將枚舉值列印為文本,讓我們探索三種有效的解決方案:
1。使用映射:
利用 std::map 可以有效地將枚舉值查找到其對應的文字表示形式。
#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.使用結構數組進行線性搜尋:
此方法涉及建立一個結構數組,每個結構數組包含一個枚舉值及其對應的文本。然後使用線性搜尋來檢索所需枚舉值的文字。
#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.使用switch/case:
雖然比映射方法效率低,但switch/case 也可以用來將枚舉值對應到文字。
#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"; } }; }
以上是如何在不使用 if/switch 語句的情況下將 C 枚舉值列印為文字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!