如何为STL容器指定模板函数
How to specify template function for STL container?
我需要将不同类型的值写入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(专门的功能模板?
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);
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
的调用中明确指定的模板参数。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 有没有办法捕获 STL 函数未被赋予正确参数的异常?
- 如何在 STL 函数中找到传递给谓词的元素的索引?
- 不能对类型化模板使用 STL 函数
- 如何使用 binary_search STL 函数在嵌套类中搜索整数?
- C++ 如何将参数传递给 STL 函数
- 如何将 STL 队列推送函数绑定到 std::函数?
- STL 函数和函数类型与函数指针类型
- 接受任何 STL 容器的函数
- 重载 STL 函数
- 为什么 stl 字符串C++函数有时出错有时会出错?
- 如何将元素从 STL 队列传递到函数?
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- 为什么 STL 函数使用节点的颜色来计算 std::map 节点前身