C++ 可变形参

C++11新标准提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,我们可以编写一种特殊的函数,也就是所谓的可变参数模板
C++还有一种特殊的形参类型(即省略符),可以用它传递可变数量的实参。这种功能一般只用于与C函数交互的接口程序。

initializer_list形参

initializer_list是一种标准库类型,用于表示某种特定类型的值的数组
initializer_list类型定义在同名的头文件中,它提供的操作

initializer_list<T> lst;//默认初始化 T类型元素的空列表
initializer_list<T> lst{a,b,c,d...};//lst的元素数量和初始值一样多;lst的元素是对应初始值的副本;列表中的元素是const
lst2(lst);//拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素;
lst2=lst;//拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素
lst.size();//列表中的数量
lst.begin();//第一个元素的指针
lst.end();//尾部元素的下一个位置的指针

initializer_list 与vector相似 定义对象的时候需要指定元素类型。
不同之处是 initializer_list 的元素永远是常量值,无法修改initializer_list 对象中的值

void error_msg(initializer_list<string> il){
  for(auto beg=il.begin();beg!=il.end();++beg){
    cout<<*beg<<endl; //解引用beg以访问当前元素并输出它的值
   }
cout<<endl;
}

error_msg({"line199","funcName","bug"});
error_msg({"line199","funcName","ok"});


void error_msg1(ErrCode e,initializer_list<string> il){
cout<<e.msg()<<endl;
  for(const auto &elem:il){
    cout<<elem<<endl; //
   }
cout<<endl;
}
error_msg(ErrCode(42), {"line199","funcName","bug"});
error_msg(ErrCode(0), {"line199","funcName","ok"});

省略符形参

省略符形参是为了便于C++程序访问某些特殊的C代码而设置的,这些代码使用了名为varargs的C标准库功能。通常,省略符形参不应用于其他目的。你的C编译器文档会描述如何使用varargs。
省略符形参应该仅仅用于C和C++通用的类型。特别应该注意的是,大多数类类型的对象在传递给省略符形参时都无法正确拷贝。
省略符形参只能出现在形参列表的最后一个位置,它的形式无外乎以下两种:

void foo(parm_list,...);
void foo(...);

posted @ 2021-06-04 11:25  simp00  阅读(331)  评论(0编辑  收藏  举报