含有可变形参的函数(initializer_list)(C++)

功能:

有时我们无法预知应该向函数传递几个实参,为了编写能够处理不同数量实参的函数,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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值