Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get attribute by name

I have a struct definition with about 25 elements

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

and I'm trying to fill it with some map values

Map<String,String> A    

and it appears to be very annoying to do such thing n times

X->xx = A["aaa"]    

every time that I want to fill my message struct.

Is it possible to access the members by name, e.g.

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

and put it into a loop?

like image 846
Skan Avatar asked Feb 27 '12 16:02

Skan


2 Answers

C++ lacks built-in reflection capabilities of more dynamic languages, so you cannot do what you would like using he out of the box capabilities of the language.

However, if all members are of the same type, you can do it with a map of pointers to members and a little preparation:

 // 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"];
like image 113
Sergey Kalinichenko Avatar answered Oct 23 '22 10:10

Sergey Kalinichenko


Short answer: no. This is C++, a statically compiled language, where the structure member names are converted by the compiler into memory offsets. It is not dynamic like PHP or Python where the runtime is involved with all variable references.

like image 42
Jonathon Reinhart Avatar answered Oct 23 '22 09:10

Jonathon Reinhart