首页 >后端开发 >C++ >如何在 C 中以文本形式检索枚举值?

如何在 C 中以文本形式检索枚举值?

DDD
DDD原创
2024-11-30 07:56:12992浏览

How to Retrieve Enum Values as Text in C  ?

在 C 中以文本形式检索枚举值

在 C 中,打印枚举的默认行为是输出其数值。但是,在某些情况下,需要检索枚举值的文本表示。

不使用 if/switch 的解决方案:

使用映射:

#include <map>
#include <string_view>

enum Errors { ErrorA = 0, ErrorB, ErrorC };

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];
}

使用线性数组搜索:

#include <string_view>

enum Errors { ErrorA = 0, ErrorB, ErrorC };

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} // Placeholder for default case
    };
#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;
}

使用 Switch/Case 语句:

#include <string>

enum Errors { ErrorA = 0, ErrorB, ErrorC };

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
    }();
}

测试用例:

#include <iostream>

int main() {
    std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC;
    return 0;
}

以上是如何在 C 中以文本形式检索枚举值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn