• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++的可变参数模板函数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

可变参数模板函数写法:

模板参数里写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函数。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
iOS开发——C篇&amp;动态内存分配发布时间:2022-07-13
下一篇:
C#执行bat文件批处理-实现应用程序开机启动功能发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap