功能:
有时我们无法预知应该向函数传递几个实参,为了编写能够处理不同数量实参的函数,C++11提供了两种主要方法:如果所有实参类型相同,可以传递一个名为initialzer_list的标准库类型;如果实参的类型不同,我们可以编写一种特殊的函数,也就是所谓的可变参数模板。还有一种是C语言的省略符形参varargs。
今天主要介绍一下initialzer_list。
initializer_list是一种模板类型,定义在同名的头文件中,其提供的操作有:
initializer_list<T> lst; //默认初始化,T类型元素的空列表。
initializer_list<T> lst{a,b,c...}; //lst的元素数量的初始值一样多;lst的元素是对应初始值的副本;列表中的元素是const
lst2(lst);
lst2=lst; //拷贝或赋值一个initializer_list对象不会拷贝列表中的元素,拷贝后原始列表和副本共享元素。
lst.size(); //列表中的元素数量
lst.begin(); //返回指向lst中首元素的指针
lst.end(); //返回指向lst中尾元素下一个位置的指针
测试:
使用initialzer_list编写一个可以输出错误信息的函数,使其可以作用于可变数量的实参。
void errorPrint(initializer_list<string> lst)
{
for(auto beg=lst.begin();beg!=lst.end();++beg)
{
cout << *beg << " ";
}
cout << endl;
}
void test()
{
string s1,s2;
cout << "输入s1:" << endl;
getline(cin,s1);
cout << "输入s2:" << endl;
getline(cin,s2);
if(s1!=s2)
{
errorPrint({"functionX",s1,s2}); //传入3个参数
}
else
{
errorPrint({"functionX","okay"}); //传入2个参数
}
}
运行结果:
输入s1:
abc
输入s2:
abc
functionX okay
输入s1:
abc
输入s2:
def
functionX abc def
可包含其他参数:
含有initialzer_list形参的函数也可以同时拥有其他形参,现在对刚才的函数进行修改:
void errorPrint(int errorType,initializer_list<string> lst) //新增一个int类型的参数
{
cout << errorType << ":";
for(auto beg=lst.begin();beg!=lst.end();++beg)
{
cout << *beg << " ";
}
cout << endl;
}
void test()
{
string s1,s2;
cout << "输入s1:" << endl;
getline(cin,s1);
cout << "输入s2:" << endl;
getline(cin,s2);
if(s1!=s2)
{
errorPrint(1,{"functionX",s1,s2});
}
else
{
errorPrint(2,{"functionX","okay"});
}
}
运行结果:
输入s1:
abc
输入s2:
abc
2:functionX okay
输入s1:
abc
输入s2:
def
1:functionX abc def