2009-05-20 22 views
4

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

EDIT: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); 
+0

C++には反射がありません。 http://stackoverflow.com/questions/359237/why-does-c-not-have-reflection – lothar

+0

フィードバックをいただきありがとうございます。私はC++にはリフレクションがないことを知っています。 – Mike

+3

@Mike C++にリフレクションがないことを知っていれば、すぐに質問を無駄にしないでしょうか?あなたは何らかの反省(言葉に組み込まれているか、あなたのものを手に入れている)なしで尋ねるようなことをどのように列挙できますか? – lothar

答えて

4

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

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

もちろん、これはすべての変数がヒープ上にある可能性が高いことを意味し、このアプローチではパフォーマンスが低下します。 std :: mapアプローチでは、「貧乏人」のようなリフレクションがあることを意味します。

2

Boostには、あなたのニーズに合わせてすぐに使えるVariantライブラリが用意されています。

0

何らかのデバッガを構築しているように感じます。私はあなたが実行可能ファイルを構築している間にpdbファイルを生成することを確認したら、これを実行可能にすべきだと思います。

ないあなたは、この列挙をやりたい文脈で確認してください、しかし、あなたのプログラムであなたがなどの変数から型情報を取得するために dbghelp.dll Microsoftのから関数を呼び出すことができるはずです(私はあなたが使用していると仮定しています窓、これは当然のことではないかもしれません)

これはあなたをもう少し助けてくれることを願っています。

乾杯!

2

最も簡単な方法 - Objective-CまたはObjective-C++に切り替えます。その言語は良いイントロスペクションを持ち、C/C++ソースと完全に互換性があります。

また、m4/cog/...を使用して、生成構造とその記述をいくつかのメタ記述から得ることができます。

3

中間ファイルでタイプを指定して、そのタイプからC++コードを生成することができます。これは、idlファイルからCOMクラスを生成できるようなものです。生成されたコードは、これらのタイプの反映機能を提供します。

私は別のプロジェクトのための2つの異なった方法に類似の何かをやった:

  • C#の型として、取得するためにC#のリフレクションを使用するタイプを定義生成を行うためのRubyスクリプトによって解析されたカスタムファイルすべての情報と、このからC++を生成する(複雑に聞こえるが、驚くほどうまく機能、および型定義を書くことがC++の定義を書くと非常に似ている)
0

C++は、反射組み込みを持っていないので、あなただけの情報を得ることができますn構造体の内容について別々にプログラムを教えてください。

これは、後で構造情報を知るために使用できる形式から構造を生成するか、構造情報を抽出するために.hファイルを解析することによって行うことができます。

関連する問題