最近在看侯捷老师的课程,其中讲了一个利用可变参数模板实现的print函数,可以将任意个数任意类型的参数传递给print函数(如果是类的话,需要重载<<符号),很好用,分享给大家:
class A{
public:
int a;
int b;
A(int i, int j):a(i), b(j){}
};
ostream& operator<<(ostream& os, const A& t){
os << "a:" << t.a << "\t b:" << t.b;
return os;
}
void print(){}
template<typename T, typename... Types>
void print(const T& first, const Types&... args){
cout << first << "\t num:" << sizeof...(args) << endl;
print(args...);
}
int main()
{
A a(1,2);
print(3,4,"gg", 90.7, a);
return 0;
}
简单解释一下:
首先,print会调用函数模板的print函数,然后将参数分为1和n个,第一个参数匹配first,后面n个参数匹配args,
然后进行递归;第二次递归将参数分为1和n-1个,之后就一直递归,直到参数个数为0时,便会去调用最上面那个没有参数空print,然后程序结束。当传入的参数是一个对象时,需要重载<<符号才可以。
代码中值得注意的是三个“…”的位置