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

c++11新特性(3)之可变参数模板(variadictemplate)可变参数模板(variadic template)
听说这是⼀个c++新特性 中最⼤的改动,我的认识有限只能写⼀些⼗分基础的理解,但我会持续更新。
所谓可变参数模板,就是模板函数的参数是可以变化的,不是⼀个、两个参数,⽽是⼀包参数,这⼀包参数可以是0个到n个,这种将参数打包的操作就是可变参数模板。具体的语法如下:
template<typename Args>
void printX(T& firstarg,Args&... args);
我们也可以得到这个包的⼤⼩:这是承接上⾯的代码,两种写法的结果是⼀致的。
<(Args);
<(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 Args>
void printX(T& firstarg,Args&... args){
企业如何管理人才cout << "进⼊可变参数的模板函数" << endl;
cout << "(Args)=" << (Args) << endl;
cout << "(args)=" << (args) << endl;
cout << firstarg << endl;
);
}
int main(){
string str = "hello";
int i = 25;
double j = 12.23;
float m = 123.56;
printX(str,i,j,m);
return 0;
}
结果:
女吉他手
进⼊可变参数的模板函数
<(Args)=3
<(args)=3
hello
进⼊可变参数的模板函数
<(Args)=2
拉弗曲线>alphabetic writing system
<(args)=2
25
进⼊两个参数的模板函数
12.23
123.56
英语值日报告解释:从上⾯的代码可以看出来,当只剩下两个参数的时候,两个模板函数都是符合的,但是编译器选择了有两个参数的模板函数,⽽没有选择可变参数的模板函数,原因是因为两个参数的模板函数与可变参数模板相⽐更具有特例化。这⾥引⽤c++ primer 第五版615页的⼀段话:
如果恰有⼀个函数提供了⼀个⽐任何其他函数都更好的匹配,则选择此函数。但是,如果有多个函数提供同样好的匹配,侧:
---如果同样好的函数中只有⼀个是⾮模板函数,则选择此函数。
---如果同样好的函数中没有⾮模板函数,⽽是有多个模板函数,且其中⼀个模板⽐其他模板更特例化,则选择此模板。
---否则,此调⽤有歧义。
⼩结:
从上⾯的例⼦可以看到操作符“...”三个点有两种⽤法:
1. ⽤来声明⼀个参数包,这个参数包可以是0或多个,如上⾯的代码中:
template<typename Args>
void printX(T& firstarg,Args&... args){
2. 当“...”三个点跟在数据包对象的后⾯时,⽤来将数据包展开。如上⾯的代码中:
);

本文发布于:2024-09-22 07:21:18,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/140835.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模板   参数   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议