首页 > 后端开发 > C++ > 如何在不使用 if/switch 语句的情况下将 C 枚举值打印为文本?

如何在不使用 if/switch 语句的情况下将 C 枚举值打印为文本?

Susan Sarandon
发布: 2024-11-27 19:24:15
原创
536 人浏览过

How Can I Print C   Enum Values as Text Without Using if/switch Statements?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板