记录一下对参数包的新认识,前置…叫做XX包,后置…叫做包扩展。我对这个包扩展的理解是递归把这个包分解了,而不是扩展,就比如说这个函数void fun(T t,Args… args)下面的return是解出来一个参数给t,解出来一个参数给t,直到剩下最后一个参数的时候调用最上面的函数(相当于递归函数的 出口),如果没有最上面的这个fun是不能运行的。 这个T类型也必须放在函数的开头,如果不是这样会发生未找到匹配函数,这个很好理解。还是拿这个函数来举例子,s传给T,age和grade变成一个参数包,输出完s递归把age分解给T,然后grade由上面的函数输出,整个调用就结束了。
template<typename T>
void fun(T args) {//最后一个参数才调用这个函数
cout << args << endl;
}
template<typename T,typename ...Args>//模板上的...叫做模板参数包
void fun(T t,Args... args) {//这个叫做参数包
cout << t << endl;
return fun(args...);//后置的...叫做包扩展。
//cout << args << endl;
}
int main() {
int age = 21;
string s = "dxgzg";
int grade = 100;
fun(s, age,grade);
return 0;
}