2012-03-14 63 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(); 
} 

但是,當我編譯它(G ++ 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