按名称获取属性

时间:2012-02-27 16:43:23

标签: c++ struct getelementsbyname

我有一个包含大约25个元素的结构定义

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

我试图用一些地图值填充它

Map<String,String> A    

并且这样做n次似乎很烦人

X->xx = A["aaa"]    

每次我想填写我的消息结构。

是否可以按名称访问成员,例如

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

并将其置于循环中?

5 个答案:

答案 0 :(得分: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"];

答案 1 :(得分:2)

简答:不。这是C ++,一种静态编译的语言,其中结构成员名称由编译器转换为内存偏移量。它不像PHP或Python那样是动态的,其中运行时涉及所有变量引用。

答案 2 :(得分:1)

没有。 C ++没有反射。但Java确实如此。不出所料,与Java等语言相比,更容易遇到与SOA相关的东西,而不像C语言那样。

答案 3 :(得分:1)

真的不可能这样做;您需要的信息在运行时不再存在。您可能能够使用map和一些指针做一些事情,但说实话,您可能最好将其包装在一个带map的函数中并将值放入适当的值字段。

答案 4 :(得分:0)

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