Прохождение членов класса C ++ - PullRequest
2 голосов
/ 30 декабря 2010

Насколько я знаю, если у меня есть такой класс, как:

class TileSurface{
   public:
      Tile * tile;
      enum Type{
         Top,
         Left,
         Right
      };
      Type type;
      Point2D screenverts[4]; // it's a rectangle.. so..
      TileSurface(Tile * thetile, Type thetype);
};

Нет простого способа программно (с использованием шаблонов или чего-либо еще) пройти через каждого члена и выполнить такие вещи, как распечатать его.типы (например, typeinfo (typeile (Tile) .name ()).

Возможность циклически проходить по ним была бы полезным и простым способом создания отчетов о размере класса и т. д. Это невозможно сделать, илиЕсть ли способ (даже с использованием внешних инструментов) для этого?

Ответы [ 6 ]

2 голосов
/ 30 декабря 2010

Просто не возможно в C ++. Для реализации этого вам понадобится что-то вроде Reflection, которого нет в C ++.

Что касается вашего кода после его компиляции, то "класс" не существует - имена переменных, а также их типы не имеют значения в сборке, и поэтому они не кодируются в двоичный файл.

(Примечание: когда я говорю «Невозможно в C ++», я имею в виду «невозможно встроить в язык» - вы, конечно, могли бы написать синтаксический анализатор C ++ в C ++, который мог бы реализовать подобные вещи ...)

1 голос
/ 30 декабря 2010

Нет.Легкого пути нет.Если отбросить «легкий путь», то с C ++ вы можете делать все, что только можно вообразить.

Если вы хотите просто вывести содержимое данных во время выполнения, то самый простой способ - реализовать оператор << (ostream &, YourClass const &)для каждого интересующего Вас класса. Немного сложнее реализовать шаблон посетителя, но с шаблоном посетителя вы можете получать разные отчеты от разных посетителей, а также посетители могут делать другие вещи, а не только создавать отчеты. </p>

Если вам нужен статический анализ (программа не запущена, вы хотите создавать отчеты), вы можете использовать базу данных отладчика.В качестве альтернативы вы можете проанализировать AST, сгенерированный некоторыми компиляторами (g ++ и CLang имеют опции для его генерации) и сгенерировать отчеты из него.

Если вам действительно нужно отражение во время выполнения, вам нужно встроить его в свои классы.Это включает в себя накладные расходы.Например, вы можете использовать общие базовые классы и поместить все элементы данных классов в массив.Это часто делается для связи с приложениями, написанными на языках, которые имеют отражение на более равных основаниях (самый старый пример - Лисп).

1 голос
/ 30 декабря 2010

Прошу отличаться от общепринятого мнения.C ++ имеет это;это не является частью стандарта C ++, но каждый отдельный компилятор C ++, который я видел, испускает метаданные такого типа для использования отладчиком.

Более того, два формата базы данных отладки охватывают почти все современные компиляторы: pdb (формат Microsoft) и dwarf2 (почти все остальное).

0 голосов
/ 30 декабря 2010

Наш набор инструментов для реинжиниринга программного обеспечения DMS - это то, что вы называете "внешним инструментом" для извлечения / преобразования произвольного кода. DMS - это обобщенная технология компиляции, параметризованная явными определениями языка. У него есть определения языка для C, C ++, Java, COBOL, PHP, ...

Для версий C, C ++, Java и COBOL обеспечивает полный доступ к деревьям разбора и информации таблицы символов. Эта информация таблицы символов включает в себя данные, которые вы, вероятно, захотите получить от «отражения». Если ваша цель - перечислить некоторый набор полей или методов и сделать что-то с ними, DMS можно использовать для преобразования кода (или генерации производного кода) в соответствии с тем, что вы найдете в таблицах символов произвольным образом .

0 голосов
/ 30 декабря 2010

Внешние инструменты: вы упомянули, что вам нужны отчеты, например, о размере класса и т.

0 голосов
/ 30 декабря 2010

Если вы извлекаете все типы переменных-членов из вашего общего typeinfo-provider-baseclass, то вы можете получить это.Это немного больше работы, чем в Java, но возможно.

...