在c++11中声明可变函数模板需要typename或者class后面跟上"…".
省略号有两个作用:
1.声明一个参数包,这个参数包可以有0到任意个参数
2.在模板定义的右边,可以将参数包展开成一个一个独立的参数
可变函数模板的定义:
template <class... T>
void f(T... args) {
std::cout << sizeof ...(args) << std::endl;
}
int main(int argc, char* argv[]) {
f(); //0
f(1, 1.0); //2
f(1, 1, false); //3
system("pause");
}
可变模板参数的展开
1.递归函数方式展开参数包
#include <iostream>
void print() {
std::cout << "empty" << std::endl;
}
//展开函数
template<class T,class ...Args>
void print(T head,Args... rest) {
std::cout << "paramerter " << head << std::endl;
print(rest...);
}
int main() {
print(1, "aaaa", true);
system("pause");
return 0;
}
2.逗号表达式和初始化列表方式展开参数包
递归函数展开参数包是一种标准做法,但是必须有一个终止递归函数,借助逗号表达式和初始化列表也可以展开
template<class T>
void print(T t){
std::cout<< t << std::endl;
}
//常规写法
template<class ...Args>
void expand(Args... args){
int arr[] = {(print(args),0)...};
}
//lambda表达式写法
template<class ...Args>
void expand(Args... args) {
std::initializer_list<int> { ([=] {std::cout << args << std::endl; }(),0)... };
}
int main() {
expand("aaa",1,true);
}