作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将不同类型的值写入 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);
关于c++ - 如何为STL容器指定模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38888025/
我是一名优秀的程序员,十分优秀!