c ++中的运行时类型和属性标识

时间:2011-03-11 13:56:13

标签: c++ windows class

我有一个在'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];
    }
}

谢谢!

4 个答案:

答案 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所述。我也同意他的看法,这种需要可能表明一种错误的做法。

无论如何,您可能希望阅读cppreflectionRTTI_Part1

答案 3 :(得分:0)

在一个结构中拥有超过100个字段对我来说并不是很好。不知道你的结构的细节,但听起来不是一个好的设计。但是,如果这是必须的,那么您可以考虑使用字典(读取映射)来保存名称(键)和值的集合。您可以根据需要为字典添加任意数量的名称 - 值对,并且您的结构将不再更改。