当前位置: 编程技术>c/c++/嵌入式
C++可变参数的函数与模板实例分析
来源: 互联网 发布时间:2014-10-27
本文导语: 本文实例展示了C++可变参数的函数与模板的实现方法,有助于大家更好的理解可变参数的函数与模板的应用,具体内容如下: 首先,所谓可变参数指的是函数的参数个数可变,参数类型不定的函数。为了编写能处理不同数量实...
本文实例展示了C++可变参数的函数与模板的实现方法,有助于大家更好的理解可变参数的函数与模板的应用,具体内容如下:
首先,所谓可变参数指的是函数的参数个数可变,参数类型不定的函数。为了编写能处理不同数量实参的函数,C++提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,我们可以编写可变参数模板。另外,C++还有一种特殊的省略符形参,可以用它传递可变数量的实参,不过这种一般只用于与C函数交互的接口程序。
一、可变参数函数
1、initializer_list形参
如果函数的实参数量未知但是全部实参的类型都相同,我们可以使用initializer_list类型的形参(C++11新标准)。和vector一样,initializer_list也是一种模板类型。下面看看initializer_list提供的一些操作:
#include // 头文件 initializer_list lst; // 默认初始化,T类型元素的空列表 initializer_list lst{a,b,c...}; // 初始化为初始值列表的副本 lst2(lst) // 拷贝或赋值不会拷贝列表中的元素;拷贝后, lst2 = lst // 原始列表和副本共享元素 lst.size() // 列表中的元素数量 lst.begin() // 返回指向lst中首元素的指针 lst.end() // 返回指向lst中尾元素下一位置的指针
下面给出一个例子,需要注意的是,含有initializer_list形参的函数也可以同时拥有其他形参。另外,如果想给initializer_list形参传递一个实参的序列,必须把序列放在一对花括号内:
string func(initializer_list li) { string str(""); for(auto beg=li.begin(); beg!=li.end(); ++beg) str += *beg; return str; } int main() { cout