可变参数模板函数写法:
模板参数里写typename... args,表明args是一个可变参数。
之后再函数参数里args后面也要加...,以表示该参数为可变参数。
函数参数中对于args的修饰,会扩展到所有该args的参数,比如下面代码:
//可变参数模板函数使用方法1:递归调用,每次将可变参数规模变小直到为0
template<typename T>
void print(const T& x) {
cout << "最后一次调用print,输出:" << x << endl;
}
template<typename T, typename... args>
void print(const T& x, const args&... rest) {
cout << "当前print函数输出:" << x << endl;
cout << "当前print函数的可变参数长度为:" << sizeof...(rest) << endl;
print(rest...);
}
如果调用:int i=1,j=2,k=3;那么实际print(i,j,k)调用的是:print(const int& i,const int& j,const int& k);
//可变参数模板函数使用方法2:循环调用
template<typename... args>
void print2(args&&... li) {
for (auto x : { li... }) {
cout << x << endl;
}
}
int main() {
int i = 0, j = 1, k = 2;
print2(i, j, k);
getchar();
return 0;
}
另外据C++primer上说,可变参数模板函数一般用来将它的参数转发给其他函数,比如:
template<typename... args>
void do_something(args... arg_list){
//blahblahblah
}
template<typename... args>
void f(args&&... arg_list){ //这里arg后加了&&,将arg_list的所有参数都扩展为右值引用,方便接下来的转发
do_something(std::forward<args>(arg_list)...);
}
int main(){
int x1=1;
const int x2=1;
const int& x3=x2;
int* x4=&x1;
int&& x5=move(x1);
f(x1,x2,x3,x4,x5,move(x1),1);
getchar();
return 0;
}
正好复习下转发:
f函数实际调用的样子是这样的:
可以看到完美转发的强大之处。。。所有的const、左右值、引用/指针性质全部原封不动转发给了do_something函数。
原文链接: https://www.cnblogs.com/FdWzy/p/12602424.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/195084
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!