Кажется, вы уже нашли решение, но я немного расширю.
То, к чему вы обращаетесь, называется Reflection
, то есть способность объекта описывать себя.
Большинство языков могут реализовывать отражение благодаря метаданным. Например, в Python функции и атрибуты объекта хранятся в элементе словаря.
C ++ не имеет никакой собственной системы отражения в отличие от C # или Java, которая предотвращает (например) этот тип автоматической печати / сериализации или десериализации.
Тем не менее, C ++ имеет очень мощную поддержку метапрограммирования, которая позволяет нам (посредством использования шаблонов) эмулировать отражение (во время компиляции). Обычно это делается с помощью Boost.Fusion , библиотеки, предназначенной для перехода от времени компиляции к времени выполнения.
Как показывает пример, приведенный в вашей ссылке, макрос BOOST_FUSION_ADAPT_STRUCT
позволяет вам взять стандартный struct
и присвоить ему необходимый интерфейс, который будет обрабатываться как последовательность Fusion.Sequence.
Другим примером может быть использование Fusion.Vector
или Fusion.Map
для хранения атрибутов класса и последующего предоставления этой последовательности автоматическим методам печати / сериализации / десериализации.
Однако у этой системы есть ограничение: метапрограммирование плохо сочетается с OO-программированием.
struct Base { char a; }; // Adapt
struct Derived: Base { char b; }; // Adapt
void print(Base const& b) { boost::fusion::for_each<Base>(b, Print()); }
будет печатать только элемент Base
(здесь a
). При использовании полиморфизма необходимо использовать методы virtual
в той или иной точке:)