ホームページ > バックエンド開発 > C++ > ソースコードを変更せずにCの列挙型を文字列に自動的に変換するにはどうすればよいですか?

ソースコードを変更せずにCの列挙型を文字列に自動的に変換するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-17 18:51:16
オリジナル
489 人が閲覧しました

How to Automatically Convert C   Enums to Strings Without Modifying Source Code?

C 列挙型を文字列に変換する方法

名前付き C 列挙型を操作する場合、列挙値を対応する値に変換するシナリオが発生する場合があります。文字列表現が必要です。この変換にはいくつかのアプローチが存在しますが、この記事では、ソース コードを変更せずにプロジェクト内のすべての列挙型を文字列に変換する関数の生成に関する具体的なクエリについて説明します。

X-Macros: A Comprehensive Solution

推奨されるアプローチには、X-マクロの利用が含まれます。実装例を以下に示します。

#include <iostream>

enum Colours {
#   define X(a) a,
#   include "colours.def"
#   undef X
    ColoursCount
};

char const* const colours_str[] = {
#   define X(a) #a,
#   include "colours.def"
#   undef X
    0
};

std::ostream&amp; operator<<(std::ostream&amp; os, enum Colours c)
{
    if (c >= ColoursCount || c < 0) return os << "???";
    return os << colours_str[c];
}

int main()
{
    std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl;
}
ログイン後にコピー

colours.def ファイルで、次のように列挙型を定義します。

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)
ログイン後にコピー

このメソッドは、すべての変換関数を生成する柔軟な方法を提供します。ソース コードを変更することなく、プロジェクト内の列挙型を追加できます。

カスタマイズ可能な文字列生成

または、生成された文字列表現をカスタマイズできる方法を選択することもできます。次のコード スニペットは、これを実現する方法を示しています。

#define X(a, b) a,
#define X(a, b) b,

X(Red, "red")
X(Green, "green")
// etc.
ログイン後にコピー

このアプローチにより、生成された文字列をより詳細に制御できるため、アプリケーションに特定のカスタマイズが必要な場合に特に役立ちます。

以上がソースコードを変更せずにCの列挙型を文字列に自動的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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