ホームページ >バックエンド開発 >C++ >C で列挙値をテキストとして取得するにはどうすればよいですか?

C で列挙値をテキストとして取得するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-30 07:56:12920ブラウズ

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

Linear での配列の使用検索:

#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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。