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

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

Susan Sarandon
リリース: 2024-11-29 22:08:13
オリジナル
915 人が閲覧しました

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

C : 列挙値をテキスト形式で出力する

プログラミングの分野では、数値を割り当てるために列挙型 (enum) がよく使用されます。異なる状態またはカテゴリ。ただし、列挙型を扱う場合、読みやすさと理解を向上させるために、その値をより意味のあるテキスト形式で伝える必要があります。

問題: 列挙型値をテキストに変換する

次のように定義された列挙型について考えます:

enum Errors {
    ErrorA = 0,
    ErrorB,
    ErrorC,
};
ログイン後にコピー

次に、値を出力してみます。 enum 変数の:

Errors anError = ErrorA;
std::cout << anError; // Will print "0" instead of "ErrorA"
ログイン後にコピー

ここでの課題は、enum の数値を対応するテキスト表現に変換することにあります。

Switch/If を使用しない解決策

1.マップの使用:

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート