昨天引入了不定长参数模板,给了一个简单的例子,用来封装C语言的printf函数,其实是想从侧面说,不定长参数模板具有和C语言不定长参数相似的特性。只是一个引子。
进入正题:如何编写一个不定长参数的求和函数?
代码如下:
#include <iostream>
using namespace std;
template <typename T>
auto sum_rec(T first) {
return first;
}
template <typename T1, typename... T2>
auto sum_rec(T1 first, T2... rest) {
return first + sum_rec(rest...);
}
template <typename... T>
auto sum(T... nums) {
return sum_rec(nums...);
}
int main() {
std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
return 0;
}
sum_rec 是 sum 的实现函数,sum_rec 有两种形式,一种是递归形式,一种是递归终止形式。
函数式编程有几个特别有意思的东西,一个是first,一个是rest,还有一个是apply,今天我们说first和rest。
你从我的代码中可以看出来,如果有某种机制,可以直接操作 nums... ,使得我可以取得第一个元素和剩余的元素,最好能够判定出 nums... 的长度,从而我就不需要写三个函数了,我只要写一个函数就行了,类似C语言的递归形式,一个理想的伪代码如下:
template <typename... T>
auto sum(T... nums) {
if (len(num...) == 1) {
return first(num...)
} else {
return first(num...) + sum(rest(num...));
}
}
其中 first(num...) 取出第一个元素, rest(num...) 将除掉第一个元素的剩余元素展开,len(num...)可以返回元素个数。
网友评论