2012-02-27 18 views
6

問題のプロフェッショナルな解決策が欲しいです。私はC++ SOAP2 solution.Iに取り組んでいます は、約25の要素 C++の構造体:名前で属性を取得

struct X { field 1; field 2; .. };  

のStrcut定義のそれぞれで独立しており、私はいくつかのマップが

Map<String,String> A  

値でそれを埋めるためにトリングだし、それが表示されます。そのようなことをn回

X->xx = A["aaa"]  

私は私のSOAPメッセージの構造を記入するすべての時間を行うことは非常にいらいらすることができます。

質問:struct要素を名前で呼び出すことは可能ですか? *例:..

X->get_instance_of("xx").set(A["aaa"]);  

とループに入れて *

おかげで、第C++は、反射を持っていない

+0

すべてのメンバーが同じタイプですか? – dasblinkenlight

+0

ループスルー何?解決策はいくつかのバインディングを設定することですが、十分な情報を提供していないので知るのは難しいです。 – CashCow

+0

構造は常に同じですか?そして..フィールドの型は同じですか? –

答えて

1

:次のように処理するの阿部ことにします。 Javaはやっている。当然のことながら、SOA関連のものはJavaのような言語ではCのような言語よりも遭遇する可能性が高いです。

+1

本当か分かりません。 JavaのSOAP APIは、コンパイル・ステップとしてコード・ラッパーを生成します。なぜC++にも同じことがあってはなりませんか?それを反映させる必要はありません。 –

+0

C++でも、メンバポインタや関数のオーバーロードを使って確実に行うことができます。 – Nawaz

+0

@KonradRudolph [C++ミドルウェアライター](http://webEbenezer.net)がそうしています。 –

1

これは実際にはできません。必要な情報は実行時に存在しなくなります。 mapといくつかのポインタを使って何かをすることができるかもしれませんが、ちょうどmapの値を持つ関数で値をラップし、値を適切なフィールドに入れる方が良いでしょう。

2

短い回答:いいえ。これは、静的にコンパイルされた言語で、構造体メンバ名がコンパイラによってメモリオフセットに変換されるC++です。ランタイムがすべての変数参照に関係するPHPやPythonのように動的ではありません。

8

C++には、より多くの動的言語の機能が組み込まれていないため、言語のボックス機能を使用することはできません。

しかし、すべてのメンバーが同じタイプであれば、あなたはメンバーへのポインターのマップと少しの準備でそれを行うことができます。

// typedef for the pointer-to-member 
typedef int X::*ptr_attr; 

// Declare the map of pointers to members 
map<string,ptr_attr> mattr; 
// Add pointers to individual members one by one: 
mattr["xx"] = &X::xx; 
mattr["yy"] = &X::yy; 

// Now that you have an instance of x... 
X x; 
// you can access its members by pointers using the syntax below: 
x.*mattr["xx"] = A["aa"]; 
+2

異なる型であっても、関数のオーバーロードで行うことができます。 – Nawaz

+0

@ Nawaz確かに、それは全く異なる解決策を必要とします。さらに、私が提案したものよりもそのような解決策がよりエレガントになる可能性が非常に高い。 – dasblinkenlight

+0

はい。そのような解決策の1つが[@Johannes Schaub](http://stackoverflow.com/users/34509/johannes-schaub-litb)によってここに与えられています:http://stackoverflow.com/a/287353/415784 – Nawaz

0

あなたはセットでお使いの構造体のラッパーオブジェを作成することができます/静的な基礎となる構造体の塗りつぶし/読み込みのための文字列値を繰り返し処理できるアクセサを取得します。

関連する問題