在 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中文网其他相关文章!