template <class Iter, class T> T sum(Iter first, Iter last)
{
return std::accumulate(first, last, 0.0);
}
// Not compiled...
const double b = sum(v.begin(), v.end());
// Compiled
const double b = sum<std::vector<double>::const_iterator, double>(v.begin(), v.end());
我想编写一个计算容器总和的通用模板函数。我想在不指定模板参数的情况下实现这一点。在我的尝试中,我不得不定义两个难看的参数。我怎样才能写出干净的代码?如果编译器不能完成这项工作,该函数将毫无意义。
使用Visual Studio 2013
最佳答案
无法从迭代器类型推导出返回类型 T
。
在C++14中,你可以从返回值推导出它
template <class Iter> auto sum(Iter first, Iter last)
在 C++11 中,您可以从迭代器类型中获取它
template <class Iter> auto sum(Iter first, Iter last) -> decltype(*first)
或来自特质
template <class Iter>
typename std::iterator_traits<Iter>::value_type
sum(Iter first, Iter last)
从历史上看,这会很尴尬。你可以把它作为第一个参数,这样就可以推导出第二个
template <class T, class Iter> T sum(Iter first, Iter last)
const double b = sum<double>(v.begin(), v.end());
或者增加一个额外的函数参数来指定初始值;但是你的函数将与 std::accumulate
本身相同。
您应该使用 T()
而不是 0.0
作为初始值,否则计算将使用 double
完成,无论是否是适合容器类型。
关于c++ - 无法推断模板参数 - 泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632659/