不知道大家知不知道Java的可变参数列表(即函数形参使用 类型。。。类型名 这样的写法),这样写的好处就是写函数的时候参数的个数是可以变化的。
当然C语言中也提供了。。。,比如我们熟知的printf,scanf就是使用。。。完成的,但为什么已经有了。。。,还需要 initializer_list呢?
其实printf和scanf有一个共同点大家有没有发现,那就是第一个参数为格式化字符串,而C语言的。。。必须要通过第一个参数来获取后面参数的个数,而scanf()和printf()就是通过字符串中的格式控制符来确定后方参数个数的。
但万一有些人就是不守这个规矩呢?前面第一个参数就说后面有4个参数,但调用的时候后面却只跟2个参数,就跟你去银行取钱,明明账户上只有三块五,你非要取出个几万块?可能吗,难不成你还抢银行,去特殊机构体验个十年八年的,岂不美哉?那么如果是程序,会发生什么问题?肯定得报错啊,不信的话你可以用printf或scanf试试(专治各种不服=.=)
于是,initializer_list也就应运而生了!
nitializer_list是一个模板类,可能你已经用过它了但不知道而已,比如下面的代码就用了:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vc({ 1,2,3,4 }); //这里调用了构造函数,实参为{1,2,3,4}
return 0;
}
只要你在函数调用的时候使用{},就会创建一个initializer_list的临时对象,用来构造vector
但用别人的总有点不舒服,写自己的才是最开心的,对吧=.=
initializer_list类成员:
首位迭代器:begin(),end()
长度:size()
演示:
#include<iostream>
using namespace std;
void print(initializer_list<int> list) {
for (auto it = list.begin(); it != list.end(); ++it)
cout << *it << " ";
cout << endl;
}
int main() {
print({ 1,2,3,4,5,6,7 });
return 0;
}
于是我们很成功的完成了一个参数可变长的print函数=.=,但你会发现这些参数必须是同种类型,能不能换成不同类型的,答案是:可以!只需把initializer_list的模板参数类型换成any(any:博客:https://blog.csdn.net/qq_40946921/article/details/90646022),就可以了,但由于any获取值仍需要确定值类型,所以目前来说这个方法除了把简单问题复杂化之外,并没有一点用(亲测)