Hello!
Решил разобраться, как работает в boost сериализация для полиморфных классов.
В общем-то вся соль сводится к такому коду:
#include <iostream>
#include <typeinfo>
using std::cout;
using std::endl;
//:singleton
template<class Q, class T>
class S
{
S()
{
cout << "S<" << typeid(Q).name() << ", " << typeid(T).name() << ">" << endl;
}
static S& instance_;
static void instantiate(S&)
{}
public:
static S& get_instance()
{
static S<Q, T> s;
instantiate(instance_);
return s;
}
void dummy()
{}
};
template<class Q, class T>
S<Q,T>& S<Q,T>::instance_ = S<Q,T>::get_instance();
template <void(*)()>
struct instantiate_function
{};
template <class Q, class T>
struct U
{
static void instantiate()
{
S<Q, T>::get_instance().dummy();
}
typedef instantiate_function<&U::instantiate> x;
};
template<typename T>
void F(T*, int)
{
cout << "F(0,0)" << endl;
}
//:archive visitor
class V
{
};
//:like BOOST_SERIALIZATION_REGISTER_ARCHIVE
template<typename T>
typename U<V, T>::x
F(T*, V*);
//:serializable
class A
{};
class B
{};
int main(int argc, char** argv)
{
F((A*)0, 0);
F((B*)0, 0);
return 0;
}
Вопрос: почему вызов F((A*)0, 0);
заставляет сгенериться класс S<V,A>?
Хотя функция
template<typename T>
typename U<V, T>::x
F(T*, V*);
даже не вызывается и в для overload хуже чем
template<typename T>
void F(T*, int)
(которая вызывается).
---
WBR