c++11新特性(3)之可变参数模板(variadic template)

可变参数模板(variadic template)

听说这是一个c++新特性 中最大的改动,我的认识有限只能写一些十分基础的理解,但我会持续更新。

所谓可变参数模板,就是模板函数的参数是可以变化的,不是一个、两个参数,而是一包参数,这一包参数可以是0个到n个,这种将参数打包的操作就是可变参数模板。具体的语法如下:

template<typename T,typename... Args>
void printX(T& firstarg,Args&... args);

我们也可以得到这个包的大小:这是承接上面的代码,两种写法的结果是一致的。

sizeof...(Args);

sizeof...(args) ;

第一个应用例子,递归:

#include<iostream>
using namespace std;

template<typename T1,typename T2>
void printX(T1 t1,T2 t2){
	cout << "进入两个参数的模板函数" << endl;
	cout << t1 << endl;
	cout << t2 << endl; 
}

template<typename T,typename... Args>
void printX(T& firstarg,Args&... args){
	cout << "进入可变参数的模板函数" << endl;
	cout << "sizeof...(Args)=" << sizeof...(Args) << endl;
	cout << "sizeof...(args)=" << sizeof...(args) << endl;
	cout << firstarg << endl;
	printX(args...);
}


int main(){
	string str = "hello";
	int i = 25;
	double j = 12.23;
	float m = 123.56;
	printX(str,i,j,m);
	return 0;
}

结果:

 

进入可变参数的模板函数
sizeof...(Args)=3
sizeof...(args)=3
hello
进入可变参数的模板函数
sizeof...(Args)=2
sizeof...(args)=2
25
进入两个参数的模板函数
12.23
123.56

 解释:从上面的代码可以看出来,当只剩下两个参数的时候,两个模板函数都是符合的,但是编译器选择了有两个参数的模板函数,而没有选择可变参数的模板函数,原因是因为两个参数的模板函数与可变参数模板相比更具有特例化。这里引用c++ primer 第五版615页的一段话:

如果恰有一个函数提供了一个比任何其他函数都更好的匹配,则选择此函数。但是,如果有多个函数提供同样好的匹配,侧:

---如果同样好的函数中只有一个是非模板函数,则选择此函数。

---如果同样好的函数中没有非模板函数,而是有多个模板函数,且其中一个模板比其他模板更特例化,则选择此模板。

---否则,此调用有歧义。

小结:

从上面的例子可以看到操作符“...”三个点有两种用法:

  1. 用来声明一个参数包,这个参数包可以是0或多个,如上面的代码中:
    template<typename T,typename... Args>
    void printX(T& firstarg,Args&... args){

     

  2. 当“...”三个点跟在数据包对象的后面时,用来将数据包展开。如上面的代码中:
    printX(args...);

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值