gpt4 book ai didi

c++ - 如何为STL容器指定模板函数?

转载 作者:行者123 更新时间:2023-11-30 02:30:10 24 4
gpt4 key购买 nike

我需要将不同类型的值写入 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com