Обновил задание на более прикладное: Необходимо выяснить, каков прогресс сериализации объектов классов(ну как полоска загрузки файла с сайта).
Там где объявление классов, в комментариях указаны числа,это то, в каком порядке будет проходить сериализация. Код простой в комментариях описано, что необходимо.
// это макросы которые присутствуют в целевых классах
#define START_SERIALIZATION()\
friend class boost::serialization::access;\
template <typename Archive>\
void serialize(Archive & AR, const unsigned int ver)\
{\
#define STOP_SERIALIZATION()\
}\
// В комментариях указан ПОРЯДОК прохода
struct A
{
int g;
START_SERIALIZATION() // 3 и 8
AR & g; // 4 и 9
STOP_SERIALIZATION()
};
struct B
{
A a;
START_SERIALIZATION() // 6
AR & a; // 7
STOP_SERIALIZATION()
};
struct C
{
A a;
B b;
START_SERIALIZATION() // 1
AR & a; // 2
AR & b; // 5
STOP_SERIALIZATION()
};
int main()
{
std::system("chcp 1251");
C c;
// вызвали
std::ofstream file("file.txt");
boost::archive::text_oarchive oa(file);
oa << c; // !! вот отсюда начинается сериализация, дальше смотреть на номера в комментариях при объявлении классов.
//// !!!!
// В момент выполнения 'oa << c;' мне нужно в другом потоке знать процент его выполнения. Например : всего объектов 200 обработано 34. Процент записи классов: 17%
//// !!!!
std::system("pause");
return 0;
}
Идей как таким образом автоматически вычислить процент сохранения класса у меня вообще нет(кроме сохранения результатов предыдущего сохранения(но это будет не точный процент)).
А почему бы не посчитать?
А не конструирует другие объекты, значит, создание А вызывает 1 конструктор.B конструирует дополнительный А, значит, создание B вызывает 1 + 1 = 2 конструктора.C конструирует дополнительныe 2 шт. А и 1 шт. B, значит, создание C вызывает 1 + 2 * 1 + 1 * 2 = 5 конструкторов.main конструирует 1 шт. C, итого всего 5 конструкторов.Вот автоматическое решение:
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define CONSTUCTOR_MACRO(r, data, elem) \
+ BOOST_PP_SEQ_ELEM(0, elem) ::NUMBER_OF_CONSTUCTORS
#define FIELD_MACRO(r, data, elem) \
BOOST_PP_SEQ_ELEM(0, elem) BOOST_PP_SEQ_ELEM(1, elem);
#define SERIALIZATION(...) \
static const int NUMBER_OF_CONSTUCTORS = 1 \
BOOST_PP_SEQ_FOR_EACH(\
CONSTUCTOR_MACRO, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) \
; \
BOOST_PP_SEQ_FOR_EACH(FIELD_MACRO, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
#define SERIALIZATION_Z() \
static const int NUMBER_OF_CONSTUCTORS = 1;
struct A
{
SERIALIZATION_Z()
A(){ std::cout << "\nA()"; }
};
struct B
{
SERIALIZATION
(
(A)(a)
)
B() { std::cout << "\nB()"; }
};
struct C
{
SERIALIZATION
(
(A)(a),
(B)(b)
)
C(){ std::cout << "\nC()"; A a; }
};
int main(int argc, char* argv[])
{
std::cout << A::NUMBER_OF_CONSTUCTORS << std::endl;
std::cout << B::NUMBER_OF_CONSTUCTORS << std::endl;
std::cout << C::NUMBER_OF_CONSTUCTORS << std::endl;
return 0;
}
Используется boost::preprocessor.
Поля генерируются тем же макросом. Туда же можно «запихнуть» и создание сериализирующей функции.
P. S.: Меня вдохновлял вот этот пример, хотя я и не смог заставить его работать на своей VS 2012.
P. P. S.: Спасибо @perfect за конструктивную критику.
Продвижение своими сайтами как стратегия роста и независимости