簡単に言うと、私が持っている (作業中の) 定義コードは次のようなものです。
enum Gadget
{
First,
Second,
};
const char* gadget_debug_names[] = {
"First",
"Second",
// note: strings are same as enum tokens here, but bonus points if
// they can optionally be given different values
};
ただし、情報が複数の別々の場所にあり、手動で維持する必要があるため、エラーが発生しやすくなります。(コードベースでは、これらの 2 つ以上の場所を扱っている場合もありますが、現在は同じファイルに含まれていません。) したがって、これらの名前を 1 回だけ指定するのは非常に便利です。
コード生成と宣言型データ ファイルを使用してこれを行うことができますが、これを行うためのより良い方法があれば、既存のビルド プロセスに別のステップを追加したくありません。次のようなものがあれば完璧です
DEFINE_GADGET(First)
DEFINE_GADGET(Second)
(オプションで、必要に応じて開始/停止マクロを使用)しかし、マクロはプレーンテキストの置換にすぎないため、プリプロセッサが列挙定義を書き出すときにトークンを「記憶」させる方法がわかりません。
メタプログラミングでもできるのではないかと思っていたのですが、どうしたらいいのか途方に暮れています。そこで見たすべての例には、データ構造を再帰的に構築することが含まれています。文字列の配列をそのように構築する方法はわかりますが、トークン名を渡す方法や列挙型を構築する方法がわかりません。(もちろん、文字列の配列を構築するためだけにメタプログラミングを使用するのは、かなりばかげています。)
コード生成を使用せずに、ここで DRY を維持する方法はありますか?