我需要将不同类型的值写入std::wstringstream
。有一段时间我们需要写出一个或多个值。我试图像这样实现它:
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)专门的功能模板?
答案 0 :(得分:2)
WriteRecord<int>(L"ipsum", buz);
^^^^^
在此明确说明ValueType
应该是int
。所以函数签名是:
void WriteRecord(const std::wstring& name, const int& val)
当您尝试传递std::vector
作为第二个参数时,编译器无法将std::vector
转换为int
。
对于函数,很少需要显式地命名模板参数的类型,你编写这样的调用就可以了:
WriteRecord(L"ipsum", buz); //Compiler deduces ValueType
如果您确实需要指定模板参数,请使用decltype
:
WriteRecord<decltype(buz)>(L"ipsum", buz);
或者只写出来(不推荐)
WriteRecord<std::vector<int>>(L"ipsum", buz);
答案 1 :(得分:1)
std::vector<int> buz(4, 0);
WriteRecord<int>(L"ipsum", buz);
// ^^^
您告诉编译器ValueType
是int
但是您传递vector<int>
作为参数。编译器完全能够推导出模板参数类型,因此请不必要地在任何地方停止指定它们。您的Foo
函数应如下所示:
void Foo()
{
int bar = 0;
WriteRecord(L"Lorem", bar);
std::vector<int> buz(4, 0);
WriteRecord(L"ipsum", buz);
}
同样,在其他函数的WriteValue
调用中删除显式指定的模板参数。