C++可变参数
参数列表的...
... 表示函数的参数个数可变,典型的如printf()
1
int printf (const char * szFormat, ...);
1 |
|
使用...实现变参数函数的两种场景
1. 格式化字符串
使用场景: 类似于实现一个printf,输入一串格式化的字符串,经过处理后可以将 %s %f %d等占位符替换为对应的数据。
1 |
|
1 |
|
注意: 上面func()函数重载了,如果不是类成员函数,要注意函数定义的顺序,在func(const char* format, ...)里要调用
func(const char* format, va_list ap)
,因此func(const char* format, ...)
要定义在后面。类内成员函数则可以是任意顺序。
实际上完成占位符替换为数据的是int vasprintf (char **buf, const char *format, va_list ap)
函数:
buf
:一个用于保存结果的字符串缓冲区
format
:一个格式化字符串 ap
:va_list类型的变量,
va_list是一个宏,和va_start(va_list, arg)、va_arg(va_list,
type)、va_end(va_list)这些宏在定义在头文件stdarg.h中,下面详细介绍通过这些宏来实现可变参数函数
2.执行时指定可变参数类型
使用场景: 将n个数进行相加,此时n是不确定的,如果用重载方法,可能要重载很多次,如下面的例子
1 |
|
使用可变参数的方法: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int sum(int count, ...) { //格式:count代表参数个数, ...代表n个参数
va_list ap; //声明一个va_list变量
va_start(ap, count); //第二个参数表示形参的个数
int res = 0;
for (int i = 0; i < count; i++) { // 按顺序返回参数列表中的参数
res += va_arg(ap, int); //第二个参数表示形参类型
}
va_end(ap); //用于清理
return res;
}
int main(){
int res = sum(3,1,2,3);
cout<<res<<endl;
return 0;
}
1 |
|
使用initializer_list实现变参函数
initializer_list
是一个列表初始化容器,声明在initializer_list头文件中,可以采用迭代器的方式来遍历参数列表,克服了...
需要指定参数个数的缺点。
1 |
|
参考: cppreference对inittializer_list的介绍
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!