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 相关的东西在 Java 这样的语言中比在 C 这样的语言中更可能遇到。

于 2012-02-27T16:46:09.990 回答
1

真的不可能做到这一点。您需要的信息在运行时不再存在。您可能可以使用 amap和一些指针来做一些事情,但老实说,您最好将其包装在一个接受 amap并将值放入适当字段的函数中。

于 2012-02-27T16:46:12.223 回答
0

您可以使用 set/get 访问器为您的结构创建一个包装器对象,这将允许您迭代字符串值以填充/读取静态的底层结构。

于 2012-02-27T16:51:41.187 回答