2012-03-14 3 views
3

Я пишу простые данные для XML-сериализатора для целей обучения. Идея состоит в передаче значений функции сериализации, которая будет делать что-то, чтобы привести данные значения в строковый формат. Многие типы имеют встроенные преобразования, но для многих я хочу, чтобы у вас была специализированная функция. Мой подход:Специализация функции шаблона с общим классом

У меня есть шаблон функции с этой подписью:

template <class T> void serialize(T *value, Serializer *serializer); 

и я могу специализировать шаблон:

template <> void serialize<bool>(bool *value, Serializer *serializer); 

работает отлично. Теперь я хочу, чтобы написать функцию сериализации для вектора, как:

template <class T> void serialize<std::vector<T*> >(std::vector<T*> *value, Serializer *serializer) { 
    serializer->begin_section("array"); 
    for(std::vector<T*>::iterator it = value->begin(); it != value->end(); it++) { 
     serializer->add_value(*it); 
    } 
    serializer->end_section(); 
} 

Но когда я скомпилировать его (г ++ 4.6.2), я получаю error: function template partial specialization ‘serialize<std::vector<T*> >’ is not allowed. Есть ли способ, которым я могу это сделать?

ответ

2

Ваша проблема заключается в том, что вы хотите предоставить специализацию шаблона, которая является самим шаблоном.

Самый простой способ решить вашу проблему - вообще не использовать специализацию шаблонов и вместо этого полагаться на перегрузку функций.

template<class T> void serialize(T *value, Serializer *serializer); 

все еще может обеспечить реализацию по умолчанию, но если более специализированная версия, как

void serialize(bool *value, Serializer *serializer); 

существует, то он будет предпочтительным решением от перегрузки. Это позволяет просто определить функцию как

template <typename T> void serialize(::std::vector<T> *value, Serializer *serializer); 

, который будет вызываться для векторов. (Учтите, что :: std :: vector более специализирован, чем T, поэтому разрешение перегрузки будет выбирать эту функцию там, где это возможно).

1

Вы можете перегрузить serialize(), for example:

#include <iostream> 
#include <vector> 

template <class T> void serialize(T *, char *) 
{ 
    std::cout << "T\n"; 
} 

template <class T> void serialize(std::vector<T*> *, char *) 
{ 
    std::cout << "vector\n"; 
} 

int main() 
{ 
    int a = 1; 
    std::vector<int*> x; 

    serialize(&a, 0); 
    serialize(&x, 0); 

    return 0; 
} 

Выход:

T 
vector 
Смежные вопросы