ホームページ  >  記事  >  バックエンド開発  >  if/switch ステートメントを使用せずに C Enum 値をテキストとして出力するにはどうすればよいですか?

if/switch ステートメントを使用せずに C Enum 値をテキストとして出力するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-27 19:24:15511ブラウズ

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

C で if/switch を使用せずに列挙値をテキストとして出力する

C では、列挙型を使用して整数値をシンボリック名に割り当てる方法が提供されます。ただし、列挙値をコンソールに出力する場合、通常はシンボル名の代わりに関連する整数が出力されます。

この制限を克服して列挙値をテキストとして出力するには、3 つの効率的なソリューションを検討してみましょう。

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 Enum 値をテキストとして出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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