【c++】含有可变形参的函数
有时我们无法预知应该向函数传递几个实参,这时候就要用到可变形参:
c++11 提供了两种主要方法:
1.initializer_list形参:
例如如下函数的定义:
//整数求和
int Sum(initializer_list<int> _list)
{
int rst = 0;
for (auto var : _list)
{
rst += var;
}
return rst;
}
这是一个求 所有整数之和 的函数,整数的个数是不确定的,我们可以采用 initializer_list 形参,
initializer_list 是一个模板类,用法很像 vector 。
模板指明参数的类型,例如 initializer_list<int> 表示int参数,所以这种方法只能实现同一类型的可变参数。
使用时只需要像vector一样循环取出即可。
来看一下调用此函数的方法:
cout << Sum({ 1,2,3,4 }) << endl; //这有点像数组的初始化,需要用 “{ }” 括起来参数列表。
2.省略符形参
省略符形参函数定义如下:
//整数求和
int Sum(int x, ...) //用...表示后续参数
{
//定义一个参数列表
va_list ap;
int result = 0;
int var;
//请看正文介绍va_start()
va_start(ap, x);
//请看正文介绍va_arg()
while (var = va_arg(ap, int))
{
result += var;
}
//销毁列表
va_end(ap);
return result + x;
}
省略符形参 可以接受不同的参数类型,但是使用起来相对复杂:
va_list 在头文件 <stdarg.h> 或 <cstdarg> 中,它是用来存储实参的。
va_arg(ap,int) 方法用来获取实参列表中的实参,“int”是实参的类型。它从首个实参依次获取,将获取到的结果作为返回值返回。
va_start(ap,x) 就是用来设置首个实参,表示取参数的时候从x的下一个参数开始。(不取x)
va_end(ap) 表示用完ap,即要释放内存。
在获取参数列表的时候,va_list并不能判断实参的总个数,所以需要设置结束参数。
在上例中,判断取得的参数是否为0,如果为0,表示参数结尾:while (var = va_arg(ap, int)) 。
所以在使用函数时,需要以0作为结束参数:
//省略符形参不需要用{},但是要以0做结尾:
cout << Sum(1, 2, 3, 4, 0) << endl;
initializer_list形参摘自《c++ Primer》一书中 6.2.6含有可变形参的函数 一节,内容有删改。
书中对于省略符形参介绍甚少,特此加以补充