无法推断出模板参数 - 泛型函数

时间:2014-10-29 14:16:10

标签: c++ templates

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

2 个答案:

答案 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{});
}