2012-03-14 13 views
3

私は、トレーニングの目的でXMLシリアライザに簡単なデータを書きます。その考え方は、値を文字列形式に変換するために何かを行うserialize関数に値を渡すことです。多くのタイプにはコンバージョンが組み込まれていますが、多くの場合、これを行う特殊な機能が必要です。私のアプローチは、次のとおりです。私はこのシグネチャを持つテンプレート関数持たジェネリッククラスのテンプレート関数の特殊化

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