我有一个在'h'文件中定义的结构(可能是一个类):
struct my_struct {
char * a;
char * b;
char * other_char;
char * hello;
// other 100 chars
// new chars can be added in future
};
我在我的项目中使用这个结构。所以我得到了这个结构的所有属性和值,并调用了函数:
void foo(char* attribute_name, char* attribute_value) {...}
有没有办法动态获取结构的属性名称和值?
我需要它,因为struct不断提高,我需要添加代码并重新编译项目。
我需要这样的东西:
void foo(my_struct s) {
int attributes = s.getAttrSize();
for (int i=0; i<attributes; ++i){
char* attribute_name = s.getAttrName[i];
char* attribute_value = s.getAttriValue[i];
}
}
谢谢!
答案 0 :(得分:5)
没有。 C ++没有反射,这个要求表明可能设计不佳。
在编程阶段为方便起见,给出了变量名,不应将其作为运行时存在的数据的标识符。
但是,您可以使用std::map
创建真实的字符串 - &gt;对象映射。
答案 1 :(得分:2)
使用multimap代替你的结构......
以上链接中的示例:
int main()
{
multimap<const char*, int, ltstr> m;
m.insert(pair<const char* const, int>("a", 1));
m.insert(pair<const char* const, int>("c", 2));
m.insert(pair<const char* const, int>("b", 3));
m.insert(pair<const char* const, int>("b", 4));
m.insert(pair<const char* const, int>("a", 5));
m.insert(pair<const char* const, int>("b", 6));
cout << "Number of elements with key a: " << m.count("a") << endl;
cout << "Number of elements with key b: " << m.count("b") << endl;
cout << "Number of elements with key c: " << m.count("c") << endl;
cout << "Elements in m: " << endl;
for (multimap<const char*, int, ltstr>::iterator it = m.begin();
it != m.end();
++it)
cout << " [" << (*it).first << ", " << (*it).second << "]" << endl;
}
答案 2 :(得分:0)
您可以使用RTTI获取有关实例化类型的信息,但不能获取类型成员名称,如@Tomalak所述。我也同意他的看法,这种需要可能表明一种错误的做法。
无论如何,您可能希望阅读cppreflection或RTTI_Part1。
答案 3 :(得分:0)
在一个结构中拥有超过100个字段对我来说并不是很好。不知道你的结构的细节,但听起来不是一个好的设计。但是,如果这是必须的,那么您可以考虑使用字典(读取映射)来保存名称(键)和值的集合。您可以根据需要为字典添加任意数量的名称 - 值对,并且您的结构将不再更改。