六一的部落格


关关难过关关过,前路漫漫亦灿灿。



可变形参, 即函数的形参个数不定

有两种, 标准库类型initializer_list, 和C语言中也会用到的省略符形参 ...


标准库类型initializer_list

要求全部实参的类型都相同

含有initializer_list形参的函数可以同时拥有其他形参

initializer_list对象中的元素永远是常量值,不可更改


头文件

1#include <initializer_list>

初始化

1initializer_list<T> lst;
2initializer_list<T> lst{a, b, c};

拷贝和赋值

拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素

1lst2(lst);
2
3lst2 = lst;

其他操作

-
list.size()
lst.begin()
lst.end()
 1initializer_list<string> ls;
 2initializer_list<int> li;
 3
 4void error_msg(initializer_list<string> il)
 5{
 6    for (auto beg = il.begin(); beg != il.end(); ++beg)
 7    {
 8        cout << *beg << " ";
 9    }
10    cout << endl;
11}
12
13if (expected != actual)
14    error_msg({"functionX", expected, actual});
15else
16    error_msg({"functionX", "okay"});

省略符形参

  1. 使用C标准库varargs
  2. 只能出现在形参列表的最后一个位置

可变形参


可变形参, 即函数的形参个数不定

有两种, 标准库类型initializer_list, 和C语言中也会用到的省略符形参 ...


标准库类型initializer_list

要求全部实参的类型都相同

含有initializer_list形参的函数可以同时拥有其他形参

initializer_list对象中的元素永远是常量值,不可更改


头文件

1#include <initializer_list>

初始化

1initializer_list<T> lst;
2initializer_list<T> lst{a, b, c};

拷贝和赋值

拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素

1lst2(lst);
2
3lst2 = lst;

其他操作

-
list.size()
lst.begin()
lst.end()
 1initializer_list<string> ls;
 2initializer_list<int> li;
 3
 4void error_msg(initializer_list<string> il)
 5{
 6    for (auto beg = il.begin(); beg != il.end(); ++beg)
 7    {
 8        cout << *beg << " ";
 9    }
10    cout << endl;
11}
12
13if (expected != actual)
14    error_msg({"functionX", expected, actual});
15else
16    error_msg({"functionX", "okay"});

省略符形参

  1. 使用C标准库varargs
  2. 只能出现在形参列表的最后一个位置