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

标签 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

最佳答案

无法从迭代器类型推导出返回类型 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/

相关文章:

c++ - C++ int和char数组地址

c++ - 按特征类专门化功能

c++ - 为什么 C++ 标准规定模板中的非限定名称是非依赖的?

c++ - 如何从装饰元素上移除一层?

c++ - 无法在 Visual Studio 2012、Windows 8.1 中打开文件 opengl32.obj

c++ - const 成员函数优先于返回值类型匹配

c++ - 模板定义中的模板特化 : is this supported for all compilers or standard usage?

c++ - 这是什么类型的归并排序?

C++ 模板编译错误

c++ - 通过模板传递成员函数指针