012 initializer_list 形参
2020-02-14 本文已影响0人
赵者也
如果函数的实参数量未知但是全部实参的类型都相同,我们可以使用 initializer_list 类型的形参。initializer_list 是一种标准库类型,用于表示某种特定类型的值得数组。initializer_list 类型定义在同名的头文件中,它提供的操作下:
initializer_list<T> lst; // 默认初始化 T 类型元素的空列表
initializer_list<T> lst{a, b, c ...}; // lst 的元素数量和初始值一样多;lst 的元素是对应初始值的副本;列表中的元素是 const
lst2(lst); lst3 = lst; // 拷贝或赋值一个 initializer_list 对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素
lst.size(); // 列表中的元素数量
lst.begin(); // 返回指向 lst 中首元素的指针
lst.end(); // 返回指向 lst 中尾元素下一位置的指针
和 vector 一样,initializer_list 也是一种模板类型。定义 initializer_list 对象时,必须说明列表中所包含元素的类型:
initializer_list<string> ls; // initializer_list 的元素类型是 string
initializer_list<int> li; // initializer_list 的元素类型是 int
和 vector 不一样的是,initializer_list 对象中的元素永远是常量值,我们无法改变 initializer_list 对象中元素的值。
我们使用如下的形式编写输出错误信息的函数,使其可以作用于可变数量的实参:
void error_msg(std::initializer_list<std::string> il) {
for (auto beg = il.begin(); beg != il.end(); ++beg) {
std::cout << *beg << " ";
}
std::cout << std::endl;
}
如果想向 initializer_list 形参中传递一个值得序列,则必须把序列放在一对花括号内:
std::string test0 = "test0";
std::string test1 = "test1";
if (test0 != test1) {
error_msg({"test", test0, test1});
} else {
error_msg({"test", "ok"});
}