type function(type arg1, ...) { }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <cstdarg>
using namespace std;

int vsum(int count, ...) {

// 定义一个变长参数类型的指针变量:ap (Argument Pointer)
va_list ap;

// 初始化指针变量ap.
// 第二个参数count是用来确定ap的起始位置的,count是vsum的第一个参数,
// 注意: 如果vsum在count参数后,还有一个命名的参数叫abc, 那么就要va_start(ap, abc)来初始化ap了
// 后边的变长参数是根据count的地址来计算出来
va_start(ap, count);

int val(0);
int sum(0);

// 遍历变长参数内容,通过ap。
for (int i=0; i<count; ++i) {
// va_arg的第一个参数是va_list定义的变长参数指针ap,
// 第二个参数指明了当前位置变长参数的类型。va_arg会自动改变ap的指针位置。
// 下次再调用va_arg它就自动取下一个参数了,这里ap就像个迭代器
val = va_arg(ap, int);
sum += val;
}

// 清理工作
va_end(ap);

return sum;
}

int main()
{
cout << vsum(4, 1,2,3,4) << endl;
}

示例:递归求和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;

template <typename T>
T vsum(const T &t) { return t; }

template <typename T, typename ... Args>
T vsum(const T &t, const Args&... args) {
T sum(0);
sum += t;
sum += vsum(args...);
return sum;
}

int main()
{
cout << vsum(1,2,3,4) << endl;
}

参考:https://blog.csdn.net/elloop/article/details/50092631