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
答案 0 :(得分:4)
返回类型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
进行计算。< / p>
答案 1 :(得分:3)
无法推断出返回类型T.
以下可能会有所帮助:
template <class Iter>
typename std::iterator_traits<Iter>::value_type sum(Iter first, Iter last)
{
return std::accumulate(first, last, typename std::iterator_traits<Iter>::value_type{});
}