类似于可变参数列表,它为函数模版和类模版提供了一种可接受多个参数的途径,它可以使函数接受任意数量任何类型的参数。
这个可变参数模版,有4个关键因素:1、模版参数包;2、函数参数包;3、解包;4、递归。
它把模版的类型与参数分开来考虑,如下图所示:
T是模版的参数列表,而value则被当做函数的参数列表来看待。当你实例化一个函数模版,就是向模版传一个实参时,实参的类型实例化了T,实参的值实例化了value。
模版的可变参数列表语法如下所示:
这个感觉就像在原来的模版参数写法上的typename后面加上三个点,又因为此时Args代表了函数参数的类型,此时也要在Args后面加上三个点。此时的Args被称为类型包,而args被称为参数包,当然具体的名字可以随便取。你一旦完成了这个可变参数列表的模版,就可以像下图这样使用它:
解包是指什么意思呢?你通过一个可变参数列表把一大堆的参数传进来,但是你如果想对这个参数列表中的某个参数进行操作时该怎么指示这个参数呢,那就需要解包。
这里show_list1是个迭代的过程,通过在函数内show_list1的参数args后面加上三个点就可以把参数列表整体传进来。但是这会造成一个无限递归,所以这个不好。
因此该技术提出了一种解决办法,那就是每次迭代都处理第一个参数,如此往复总有那么一个时刻会把参数处理完。那么它的处理方式如下所示:
实例如下:
在main函数中的使用方法如下所示:
但是如上面的声明式所示,该函数模版使用的是值传递,这对于大型的参数而言效率太低,于是该可以使用const修饰符在参数声明上。