Как сделать рефлексию
От: x-code  
Дата: 14.07.15 09:53
Оценка:
А подскажите какие-нибудь решения по рефлексии в С++.
Имеется: много классов (штук 300), они выстроены в иерархию от общего базового класса.
В каждом классе есть поля данных, разных типов:
— базовых (int, float...),
— строки,
— указатели на объекты других классов этой иерархии,
— указатели на некоторые внешние классы.
— массивы базовых типов
— массивы указателей на классы иерархии
— указатели на массивы указателей на классы иерархии
(проект не мой, я просто кое-что допиливаю)
Хочется сделать универсальный обход по объектам этой иерархии классов, как по дереву, с загрузкой данных в GUI дерево.
При этом поля данных должны остаться самими собой, то есть крайне нежелательно заворачивать их в какие-то объектные обертки с перегруженными операторами.

Нужно синтаксически обернуть эти поля данных в какие-то макросы, чтобы в итоге, кроме собственно полей данных, в классах сгенерировалась какая-то функция или метаданные или что-то еще (?)
со следующими свойствами
1. внешняя итерация по множеству полей класса, в общем без разницы какая — последовательная или с произвольным доступом по индексу.
2. через итерацию — обобщенный доступ к каждому элементу, с получением :
2.1 имени самой переменной (это понятно, через # препроцессора),
2.2 текстового значения переменной, если оно есть (для строк, чисел и типов, у которых определен какой-нибудь toString)
2.3 указателя на базовый класс иерархии, если это поле — указатель на любой класс иерархии, иначе null (это для рекурсивного обхода дерева)
3. если объект-массив, то можно его раскрыть рекурсивно как массив

в общем все это желательно совместить с описанием самих полей в классе. Сейчас мне приходится писать отдельные методы, которые возвращают нужную информацию для полей; хотя там все максимально автоматизировано на макросах — это все равно неудобно, можно забыть добавить поле в рефлексию или что-то перепутать.

Проблема именно в том, как в описании класса совместить собственно поля данных и что-то еще; если удастся совместить — остальное дело техники. Должно быть что-то типа такого
struct FOO : BASE
{
//... some code
  REFL_F(int, x)      // field
  REFL_A(float, y, 3) // array 
  REFL_P(BAR*, ptr)   // pointer to class hierarchy object
//... some code
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.