为什么只用一个模板( binaryOperation
和默认值为sum的那个模板)就可以完成工作,为什么在C++中定义了两个模板?我指的是来自http://www.cplusplus.com/reference/numeric/accumulate/的累加声明
发布于 2018-09-21 11:29:32
因为标准就是这样规定的。
使用重载还是默认参数通常是一个喜好问题。在这种情况下,选择了重载(由委员会、Alexander Stepanov或任何碰巧负责选择的人)。
默认值比重载更受限制。例如,你可以有一个指向第一个重载的函数指针T (*)(InputIterator, InputIterator, T)
,如果只有一个函数(模板)有4个参数,这是不可能的。在可能的情况下,这种灵活性可以用作使用重载而不是默认参数的参数。
发布于 2018-09-21 12:22:28
确实,您可以从单个模板中获得基本相同的行为,例如
template <class InputIt, class T, class BinaryOperation = std::plus<>>
accumulate(InputIt first, InputIt last, T init, BinaryOperation op = {});
但请注意,在早期版本的C++中,这将是困难或不可能的:
在C++11之前,函数模板不能具有默认模板arguments.
std::plus<>
(与std::plus<void>
相同)无效:类模板只能用一个特定的参数类型实例化。
accumulate
模板甚至比1998年的第一个C++标准更早:它回到了SGI STL库。当时,编译器对模板的支持相当不一致,因此建议保持模板尽可能简单。因此,原来的两个声明被保留了下来。正如bobah's answer中所指出的,将它们组合到一个声明中可能会破坏现有代码,因为例如,代码可能使用指向三参数版本的实例化的函数指针(并且函数指针不能表示默认的函数参数,无论该函数是否来自模板)。
有时,标准库会向现有函数添加额外的重载,但通常仅用于改善接口的特定目的,并且在可能的情况下不会破坏旧代码。std::accumulate
还没有这样的理由。
(但请注意,标准库中的成员函数可能比std::accumulate
等非成员函数更改得更频繁。该标准允许实现声明具有不同重载、默认参数等的成员函数,只要效果如所述。这意味着将指向成员函数的指针指向标准库类成员,或者首先假定非常具体的声明,这通常不是一个好主意。)
https://stackoverflow.com/questions/52442628
复制