我有一个在'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) {...}
有什么办法来dynamic获取结构的属性名称和值?
我需要它,因为结构不断提高,我需要添加代码并重新编译项目。
我需要这样的东西:
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]; } }
谢谢!
没有C ++没有反射,这个要求表明一个可能的糟糕的设计。
在编程阶段为了方便起见给出了变量名称,不应将其作为运行时存在的数据的标识符。
但是,您可以使用std::map
创建一个真正的string-> object映射。
使用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; }
您可以使用RTTI获取有关实例化类型的信息,但无法获取类型成员名称,如@Tomalak所述。 我也同意他的这种需要可能表明了一个错误的方法。
无论如何,你可能喜欢阅读cppreflection或RTTI_Part1 。
在一个单一的结构中有超过100个字段对我来说不太好。 不知道你的结构的细节,但听起来不像一个好的设计。 但是,如果这是必须的,那么你可以考虑使用字典(读取地图)来保存名称(键)和值的集合。 您可以根据需要将任意数量的名称/值对添加到字典中,并且您的结构将不再改变。