首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板