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

如何在不使用 Switch/If 语句的情况下将 C 枚举值打印为人类可读的文本?

Susan Sarandon
Susan Sarandon原创
2024-11-29 22:08:13924浏览

How Can I Print C   Enum Values as Human-Readable Text Without Using Switch/If Statements?

C :以文本格式打印枚举值

在编程领域,经常使用枚举(enum)来将数值分配给不同的状态或类别。然而,在处理枚举时,有必要以更有意义的文本格式来表达它们的值,以提高可读性和理解性。

问题:将枚举值转换为文本

考虑一个定义如下的枚举:

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

现在,让我们尝试打印一个值枚举变量:

Errors anError = ErrorA;
std::cout << anError; // Will print "0" instead of "ErrorA"

这里的挑战在于将枚举的数值转换为其相应的文本表示形式。

不使用 Switch/If 的解决方案

1。使用映射:

一种方法涉及利用映射在枚举值与其文本表示之间建立对应关系:

#include <map>
#include <string_view>

// Create a map that associates enum values with string views
std::map<Errors, std::string_view> errorTextMap = {
    {ErrorA, "ErrorA"},
    {ErrorB, "ErrorB"},
    {ErrorC, "ErrorC"},
};

// Overload the << operator to handle enum values
std::ostream&amp; operator<<(std::ostream&amp; out, const Errors value) {
    return out << errorTextMap[value];
}

2。使用结构数组进行线性搜索:

另一种解决方案涉及创建结构数组:

#include <string_view>

// Define a structure to store enum values and text representations
struct MapEntry {
    Errors value;
    std::string_view str;
};

// Create an array of structures containing the mapping
const MapEntry errorTextEntries[] = {
    {ErrorA, "ErrorA"},
    {ErrorB, "ErrorB"},
    {ErrorC, "ErrorC"},
    {ErrorA, 0} // Dummy entry to terminate the search
};

// Overload the << operator to handle enum values
std::ostream&amp; operator<<(std::ostream&amp; out, const Errors value) {
    const char* s = nullptr;
    for (const MapEntry* i = errorTextEntries; i->str; i++) {
        if (i->value == value) {
            s = i->str;
            break;
        }
    }

    return out << s;
}

测试解决方案:

演示建议的功能解决方案:

#include <iostream>

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

    return 0;
}

输出:

ErrorA
ErrorB
ErrorC

以上是如何在不使用 Switch/If 语句的情况下将 C 枚举值打印为人类可读的文本?的详细内容。更多信息请关注PHP中文网其他相关文章!

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