可变参数模板
C++11引进了一个新功能:Variadic Template Function
(可变参数模板)。通过可变参数模板,我们可以创建出接受任意类型、任意个数参数的函数。
如何使用
一个声明可变参数模板的简单例子:
template<typename T, typename ... Args>
void log(T first, Args ... args);
上面的函数可以接受1至多个参数, Arg...
代表着不同个数的模板参数。
声明一个可变参数模板函数很简单,但是定义它需要一点技巧。我们不能直接访问传进的不同数量的参数。我们需要使用c++类型解析机制以及递归来实现这一点:
template<typename T, typename ... Args>
void log(T first, Args ... args) {
cout<<first<<" , "; //打印第一个参数
log(args ...); //递归
}
void log(){ return; };
原理
接下来让我们看看调用log
时发生了什么
log(2, 2.2, "2.2");
以上代码中,三个参数的类型分别为int
, double
,const char*
编译会根据三个参数的类型以及我们声明的可变参数模板,创建一下的可变参数函数:
void log(int first, double b, const char *c){
cout<<first<<",";
log(b,c);
}
这样,第一个参数被打印了出来,剩余的两个参数继续传入另外的一个可变参数模板中,跟之前一样,编译器继续创建一个可变参数函数:
void log(double first, const char*c){
cout<<first<<endl;
log(c);
}
接下来:
void log(const char* first){
cout<<first<<endl;
log();
}
由于只有一个参数,没有多余的参数可以传递给log(),因此我们需要定义一个没有参数的log(),调用直接返回,以此来结束递归。