вопрос о template instantiation
От: KlugXP Россия
Дата: 09.11.09 10:42
Оценка:
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
template instantiation
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.