C++11 initializer_list形参

为了编写能处理不同数量实参的函数,C++11提供2种方法。
1.实参类型相同,传递一个initializer_list的标准库类型
2.类型不同,可变函数模板

initializer_list形参:
如果函数的实参数量未知但是全部实参的类型都相同,我们可以使用initializer_list类型的形参。initializer_list是一种标准库类型,用于表示某种特定类型的值的数组。initializer_list类型定义在同名的头文件中。

操作:

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

例如:

initializer_list<string> ls;
initializer_list<int> li;

initializer_list中的元素永远是常量值,无法改变。
例子:

void error_msg(initializer_list<string> il){
    for(auto beg=il.begin();beg!=il.end();++beg)
        cout<<*beg<<" ";
    cout<<endl;
}
//expected和actual是string对象
if(expected != actual)
    error_msg({"functionX",expected,actual});
else
    error_msg({"functionX" ,"okey"});

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

void error_msg(Errcode e,initializer_list<string> il){
    cout<<e.msg()<<":"
        for(const auto &elem :il)
        cout<<elem<<" ";
    cout<<endl;
}
if(expected != actual)
    error_msg({ErrCode(42) , "functionX",expected,actual});
else
    error_msg({ErrCode(0), "functionX" ,"okey"});

还有一点是省略符形参。
例如
void foo(parm_list , …);
void foo ( … );
只能用于C和C++通用的类型,一般不推荐使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值