C++可变形参函数类型 initializer_list

initializer_list形参

initializer_list是一种标准库类型,用于表示某种特定类型的值得数组
函数实参数量未知且全部实参类型相同时可使用initializer_list类型的形参

//默认初始化:T 类型元素的空列表
initializer_list lst;

//lst的元素是对应初始值的副本;列表中的元素是const
initializer_list lst{a,b,c...};

//列表中的元素数量
lst.size();

//返回指向lst中首元素的指针
lst.begin()

//返回指向lst中尾元素下一位置的指针
lst.end()

initializer_list对象中的元素永远是常量值,不可能改。
并和vector一样也是一种模板类型,定义时必须指定元素类型

initializer_list ls;
initializer_list li;

示例:

void error_msg(initializer_list lt)
{
    for(auto beg = lt.begin(); beg != lt.end(); ++beg)
    {
        cout << *beg << " ";
    }
    cout << endl;
}

同样适用迭代器来遍历initializer_list的元素,并通过解引用beg来获得当前元素的值

如果想向initializer_list形参中传递一个值得序列,则必须把序列放在一对花括号内:

string str1,str2;
...
if(str1 != str2)
    error_msg({"function error_msg", str1, str2});
else
    error_msg({"function error_msg", "okay!"});

包含initializer_list类型形参的函数也可以有其它形参,比如:

void error_msg(int num,initializer_list lt)
{
    for(auto beg = lt.begin(); beg != lt.end(); ++beg)
    {
        cout << *beg << " ";
        num++;
    }
    cout << num << endl;
}

//或

void error_msg(ErrCode e, initializer_list lt)
{
    cout << e.msg() << ": ";
    for(auto beg = lt.begin(); beg != lt.end(); ++beg)
    {
        cout << *beg << " ";
    }
    cout << endl;
}

//调用:

string str1,str2;
...
if(str1 != str2)
    error_msg(ErrCode(42), {"function error_msg", str1, str2});
else
    error_msg(ErrCode(0), {"function error_msg", "okay!"});

你可能感兴趣的:(C++可变形参函数类型 initializer_list)