5

C++ または C で構造体 (構造体 | クラス) のメンバーを列挙する方法はありますか? メンバー名、型、および値を取得する必要があります。変数がグローバルにスコープされた小さなプロジェクトで、以前に次のサンプル コードを使用したことがあります。私が今抱えている問題は、一連の値を GUI からオブジェクト、ファイル、および VM 環境にコピーする必要があることです。別の「貧乏人の」リフレクション システムを作成することも、できればまだ考えていないより良いものを作成することもできます。誰か考えがありますか?

編集: C++ にはリフレクションがないことはわかっています。

union variant_t {
   unsigned int  ui;
   int           i;
   double        d;
   char*         s;
};

struct pub_values_t {
   const char*      name;
   union variant_t* addr;
   char             type;  // 'I' is int; 'U' is unsigned int; 'D' is double; 'S' is string
};

#define pub_v(n,t) #n,(union variant_t*)&n,t
struct pub_values_t pub_values[] = {
   pub_v(somemember,  'D'),
   pub_v(somemember2, 'D'),
   pub_v(somemember3, 'U'),
   ...
};

const int no_of_pub_vs = sizeof(pub_values) / sizeof(struct pub_values_t);
4

6 に答える 6

4

明白なことを述べると、C または C++ にはリフレクションがありません。したがって、メンバー変数を列挙する信頼できる方法はありません (デフォルト)。

std::vector<boost::any>データ構造を制御できる場合は、またはを試してstd::map<std::string, boost::any>から、すべてのメンバー変数をベクター/マップに追加できます。

もちろん、これはすべての変数がヒープ上にある可能性が高いことを意味するため、このアプローチではパフォーマンスが低下します。std::map アプローチでは、一種の「貧乏人の」反射があることを意味します。

于 2009-05-20T15:21:54.357 に答える
3

中間ファイルで型を指定し、そこから C++ コードを生成できます。COM クラスのようなものを idl ファイルから生成できます。生成されたコードは、これらの型のリフレクション機能を提供します。

私は、異なるプロジェクトに対して2つの異なる方法で同様のことを行いました:

  • 生成を行うために Ruby スクリプトによって解析されるカスタム ファイル
  • 型を C# 型として定義し、C# のリフレクションを使用してすべての情報を取得し、これから C++ を生成します (複雑に聞こえますが、驚くほどうまく機能し、型定義の記述は C++ 定義の記述と非常に似ています)。
于 2009-05-21T11:09:15.203 に答える
2

Boost には、ニーズに合った、すぐに使用できるVariantライブラリがあります。

于 2009-05-20T15:22:13.170 に答える
0

ある種のデバッガーを構築しているように感じます。実行可能ファイルのビルド中にpdbファイルを生成することを確認すれば、これは実行可能であると思います。

この列挙をどのようなコンテキストで実行するかはわかりませんが、プログラムでは、Microsoftのdbghelp.dllから関数を呼び出して、変数などから型情報を取得できるはずです(もちろん、Windowsを使用していると想定しています。そうではありません)

これがあなたをもう少し先に進めるのに役立つことを願っています。

乾杯!

于 2009-05-20T15:28:28.947 に答える