c++ - 这个模板函数的最后一个参数有什么用?

标签 c++ templates

在一本关于 C++ 的书上,我找到了以下代码:

#include <iostream>
using namespace std;

template<class T> T sum(T* b, T* e, T init = T()) {
    while(b != e)
    init += *b++;
    return init;
}

int main() {
    int a[] = { 1, 2, 3 };
    cout << sum(a, a + sizeof a / sizeof a[0]) << endl; // 6
}

我的模板函数 T init = T() 的最后一个参数有什么用? 对于第三个论点,作者是这样说的:

The third argument to sum( ) is the initial value for the accumulation of the elements.

但这怎么行呢?有 3 个参数但只使用其中的前两个不是一个坏习惯吗?这是否适用于所有类型,或者换句话说,T() 是否在所有数据类型的 C++ 标准中定义?

注意:我从测试中知道它将 init 初始化为 0

最佳答案

最后一个参数是初始值,我会说。思路大概是可以继续求和或者不清楚零元素是什么。

像这样的参数就是所谓的默认参数,很常见。例如,如果您创建了自己的 vector 类:

template <class T>
Vector(const unsigned int size, const T& default_value = (T) 0);

然后您可以通过一个或两个参数创建 Vector 对象,Vector<double> vector(2);Vector<double> vector(2, 5.); .第一次调用生成一个大小为 2 且全为零的 vector ,第二次调用大小为 2 且所有条目均为 5 的 vector 。

在您的示例中,您可以在总和中添加一些内容。

在您的情况下,标准构造函数被调用,它可能被假定为零元素。

也就是说,如果您的书倾向于使用指针算术,并且习惯先省略 {} 括号,然后甚至不在省略的地方使用缩进,我会推荐另一本书。

关于c++ - 这个模板函数的最后一个参数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42950094/

相关文章:

c++ - OnTouchMove 事件未触发

c++ - 使用 C++ 从 .exe/.dll 等二进制文件中提取文本

c++ - 如何typedef模板函数指针?

c++ - 编译器能否识别模板元编程中的递归问题?

c++ - 存储可变模板参数并在另一个类中使用它们

c++ - 使用 Visual Studio 2010 在 C++ 中进行内联汇编?

c++ - 多态成员函数指针

c++ - 当 vector<char>&& 绑定(bind)到 vector<char>& 时编译器不会报错

html - 如何在 HTML/CSS 中实现 "blog"页面?

c++ - 模板参数无效