Get attribute by name

后端 未结 5 2006
野的像风
野的像风 2020-11-30 13:15

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 <

相关标签:
5条回答
  • 2020-11-30 13:25

    No. C++ doesn't have reflection. Java does though. Unsurprisingly, SOA related stuff is more probably encountered with languages like Java than it is with languages like C.

    0 讨论(0)
  • 2020-11-30 13:28

    You could create a wrapper objet for your struct with set/get accessors that will let you iterate over string values for filling/reading the underlying struct that is static.

    0 讨论(0)
  • 2020-11-30 13:35

    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.

    0 讨论(0)
  • 2020-11-30 13:43

    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"];
    
    0 讨论(0)
  • 2020-11-30 13:46

    It's not really possible to do that; the information you need is no longer present at runtime. You might be able to do something with a map and some pointers, but to be honest you would probably be better off just wrapping it up in a function that takes a map and puts the values into the appropriate fields.

    0 讨论(0)
提交回复
热议问题