2016-08-11 14 views
1

std::wstringstreamに異なるタイプの値を書き込む必要があります。一度に1つ以上の値を書き込む必要があります。私はこのようにそれを実装しようとしています:STLコンテナのテンプレート機能を指定する方法は?

wstringstream _str;  

template<typename ValueType> //(1) 
void WriteValue(const ValueType& val) 
{ 
    _str << val; 
} 

template<typename ValueType> //(2) 
void WriteValue(const std::vector<ValueType>& vals) 
{ 
    for (auto it = vals.begin(); it!= vals.end(); ++it) 
    { 
     WriteValue<ValueType>(*it); 
     _str << L" ";    
    } 
} 

template<typename ValueType> 
void WriteRecord(const std::wstring& name, const ValueType & val) 
{ 
    _str << name; 
    WriteValue<ValueType>(val); 
} 

void Foo() 
{ 
    int bar = 0; 
    WriteRecord<int>(L"Lorem", bar); //it's okay 

    std::vector<int> buz(4, 0); 
    WriteRecord<int>(L"ipsum", buz); //it's error 
} 

私は次のエラーました:そう

"cannot convert argument 2 from 'std::vector< int, std::allocator <int> >' 
to 'int &'". As seen compiler tries to pass a vector to (1), not (2). 

はなぜ?それは(2)特殊な関数のテンプレートを選択することは可能ですか?ここで

答えて

2
WriteRecord<int>(L"ipsum", buz); 
      ^^^^^ 

明示的ValueTypeintなければならないことを言います。だから、関数のシグネチャは次のとおりです。

void WriteRecord(const std::wstring& name, const int& val) 

そして、あなたは、2番目の引数としてstd::vectorを渡すしようとすると、コンパイラはintstd::vectorを変換することはできません。機能については

は、めったに明示的にテンプレート引数の型に名前を付ける必要はありません、あなたはこのような呼び出しが動作します書き込み:

WriteRecord(L"ipsum", buz); //Compiler deduces ValueType 

は、あなたが本当にテンプレート引数を指定する必要がある場合

WriteRecord<decltype(buz)>(L"ipsum", buz); 

または単に(推奨されません)、それを書き出す

:、 decltypeを使用10
WriteRecord<std::vector<int>>(L"ipsum", buz); 
+0

よろしくお願いいたします。 –

1
std::vector<int> buz(4, 0); 
WriteRecord<int>(L"ipsum", buz); 
//   ^^^ 

あなたはValueTypeintあるコンパイラを言っているが、その後、あなたは、引数としてvector<int>を渡しています。コンパイラはテンプレートの引数の型を完全に導き出すことができるので、不必要にどこでもそれらを指定しないでください。あなたのFoo機能は次のようになります。

同様
void Foo() 
{ 
    int bar = 0; 
    WriteRecord(L"Lorem", bar); 

    std::vector<int> buz(4, 0); 
    WriteRecord(L"ipsum", buz); 
} 

、他の関数でWriteValueへの呼び出しで明示的に指定されたテンプレート引数を削除します。

関連する問題