Один комментатор написал:
Если вы имеете в виду «есть ли способ, которым я могу написать шаблон для автоматического вызова метода для каждой из моих переменных-членов?», То ответ - нет ...
Мой (слегка злой) счетчик этого да, если метод - деструктор ...
#include <iostream>
using namespace std;
bool Enable = false;
template <typename T>
class DS : public T {
public:
~DS() {
if (Enable) T::Serialize();
}
};
class A {
protected:
void Serialize() { cout << "A" << endl; }
};
class B {
protected:
void Serialize() { cout << "B" << endl; }
};
typedef DS<A> DSA;
typedef DS<B> DSB;
class C {
protected:
void Serialize() { cout << "C" << endl; }
private:
DSA a;
DSB b;
};
typedef DS<C> DSC;
int
main()
{
DSC c;
{
DSC c_copy = c;
Enable = true;
}
Enable = false;
}
Выходные данные находятся в обратном порядке, поэтому для восстановления объектов вам придется анализировать сериализованные данные и помещать каждый завершенный объект в стек. Затем составные объекты будут знать, сколько дочерних элементов выпадет из стека. Или, конечно, сериализация может перейти в промежуточную структуру.
Другая интригующая идея - использовать этот хак один раз при запуске (создать и уничтожить только один специальный объект), где обратные вызовы деструкторов создадут структуру данных, описывающую исходный объект.
Я также отмечаю, что неявные конструкторы копирования имеют потенциал для аналогичного злоупотребления и возможны в прямом порядке ...