идентификация типа и атрибутов во время выполнения в c ++ - PullRequest
2 голосов
/ 11 марта 2011

У меня есть структура (может быть классом), которая определена в файле '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) {...}

Есть ли способ динамически получать имена атрибутов и значения структуры?

Мне это нужно, потому что структура постоянно поднимается, и мне нужно добавить код и перекомпилировать проект.

Мне нужно что-то вроде этого:

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 ]

5 голосов
/ 11 марта 2011

Нет. C ++ не имеет отражения, и это требование указывает на возможный плохой дизайн.

Имена переменных приведены для удобства на этапе программирования и не должны восприниматься как идентификаторы для данных, существующих во время выполнения.

Однако вы можете создать реальное отображение строки -> объекта с помощью std::map.

2 голосов
/ 11 марта 2011

Используйте 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;
}
0 голосов
/ 11 марта 2011

Наличие более 100 полей в одной структуре не очень хорошо для меня. Не знаю деталей вашей структуры, но не похоже на хороший дизайн. Однако, если это необходимо, вы можете использовать словарь (читать карту), чтобы сохранить коллекцию имен (ключей) и значений. Вы можете добавить в словарь столько пар «имя-значение», сколько захотите, и ваша структура больше не изменится.

0 голосов
/ 11 марта 2011

Вы можете использовать RTTI для получения информации об экземплярах типов, но вы не можете получить имена членов типа, как указано @Tomalak.Я также согласен с ним, что эта необходимость может указывать на ошибочный подход.

В любом случае, вы можете прочитать cppreflection или RTTI_Part1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...