c++11变长参数函数模板

By francis_hao    Mar 25,2018

 

一个最简单的实例大概是这个样子:

#include <iostream>
using namespace std;

/*
变长参数函数模板声明*/
template <typename... T>
void print(T... val);

/*
边界条件*/
void print(void)
{
    cout<<"here end"<<endl;
}

/*
递归的特例化定义*/
template <typename T1, typename... T2>
void print(T1 start, T2... var)
{
    cout<<"sizeof ... now is: "<<sizeof... (var)<<endl;
    cout<<start<<endl;
    print(var...);
}


int main(void)
{
    print(1,2,3,4);
    return 0;
}

其中的声明其实是没什么用的,只是告诉使用者可以按照这样的格式使用,如果不做这个声明,只保留"边界条件"和"递归的特例化定义",这样虽然可行,但是未免会造成困惑。

 

执行结果如下:

 

实际上,这个"变长"付出的代价还是很大的,要递归的实例出n个函数,最终再调用边界条件的函数。过程如下

 

以上可见,这个变长参数函数模板实现的一点也不"优雅",有点强行打补丁的感觉。看看"别人家的孩子"在这个问题上是怎么做的呢?以python为例,没有对比就没有伤害~

def printf(*arg):
    for val in arg:
        print(val)

if "__main__" == __name__:
    printf(1,2,3,4)

 

 


本文由 刘英皓 创作,采用 知识共享署名-非商业性使用-相同方式共享3.0中国大陆许可协议 进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/8644943.html

 

 

参考

【1】Michael Wong,IBM XL编译器中国开发团队 著 深入理解C++11:C++11新特性解析与应用 机械工业出版社:北京,2013.6

posted on 2018-03-25 15:43  刘英皓  阅读(1807)  评论(1编辑  收藏  举报