6

約25個の要素を持つ構造体定義があります

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

そして、いくつかのマップ値で埋めようとしています

Map<String,String> A    

そして、そのようなことをn回行うのは非常に面倒なようです

X->xx = A["aaa"]    

メッセージ構造体を埋めたいたびに。

名前でメンバーにアクセスすることは可能ですか?

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

ループに入れますか?

4

5 に答える 5

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"];
于 2012-02-27T16:50:21.537 に答える
2

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

于 2012-02-27T16:47:42.670 に答える
1

いいえ、C++ にはリフレクションがありません。ただし、Javaはそうします。当然のことながら、SOA 関連のものは、C などの言語よりも Java などの言語で遭遇する可能性が高くなります。

于 2012-02-27T16:46:09.990 に答える
1

それは実際には不可能です。必要な情報が実行時に存在しなくなります。a といくつかのポインターを使用して何かを実行できる可能性がありますが、正直なところ、a を受け取り、値を適切なフィールドに入れるmap関数にラップする方がよいでしょう。map

于 2012-02-27T16:46:12.223 に答える
0

set / getアクセサーを使用して、構造体のラッパーオブジェクトを作成できます。これにより、静的な基礎となる構造体を埋める/読み取るために文字列値を反復処理できます。

于 2012-02-27T16:51:41.187 に答える