在一本关于 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/