1, Basic application
#include <iostream>#include<string>#include<sstream>using namespacestd;template<typename ... Args>voidg (args ... args) {cout<<sizeof... (Args) <<endl;//number of type parameterscout<<sizeof... (args) <<endl;//number of function arguments}template<typename t>stringf (t t) {cout<<"f ()"<<Endl; Ostringstream STRM; STRM<<t<<'-'<<t<<Endl; cout<<Strm.str (); returnstrm.str ();} Template<typename t>ostream&print (Ostream &os,ConstT &t) {cout<<"P1 ()"<<Endl; returnos<<T;} Template<typename T, TypeName ... Args>ostream&print (Ostream &os,ConstT &t,Constargs&... reset) {cout<<"P2 ()"<<Endl; OS<<t<<", "; //return Print (OS, reset ...); returnprint (OS, f (reset) ...);}intMain () {g (); G (1); G (1,1.2); G (1,1.2,"Hello"); Print (cout,1,3.4,"Hello"); cout<<Endl; return 0;}
Focus on understanding its recursive invocation
2,
Variable parameter templates