2.类型不一致可变参数模板与类型一致函数模板
//类型不一致函数模板
1 #include <iostream> 2 #include <cstdarg> 3 using namespace std; 4 5 void show() 6 { 7 8 } 9 10 //参数类型不一致,个数不确定 11 template<typename T,typename...Args>//typename...Args可变参数 12 void show(T t, Args...args)//args如果没结束就当做T t,Args...args,如果结束则不是参数 13 { 14 cout << t << endl; 15 //递归 16 show(args...);//不能省略... 17 } 18 19 20 21 void main() 22 { 23 show(1, 1.8, "355", 'A'); 24 cin.get(); 25 }
- 参数不一致实现printf
1 #include <iostream> 2 #include <cstdarg> 3 using namespace std; 4 5 //递归终止 6 void show(const char *str) 7 { 8 } 9 10 template<typename T,typename...Args> 11 void show(const char *str, T t, Args...args)//args如果没结束就当做T t,Args...args,如果结束则不是参数 12 { 13 while (str && *str) 14 { 15 if (*str == '%' && *(str + 1) != '%') 16 { 17 str++;//指针向后移动 18 cout << t;//打印 19 show(++str, args...); 20 return; 21 } 22 else if(*str == '%' && *(str + 1) == '%') 23 { 24 cout << *str++; 25 str++; 26 } 27 else 28 { 29 cout << *str++;//跳过一个字符 30 } 31 } 32 } 33 34 35 36 void main() 37 { 38 show("%dabc%s%c%%%f", 10, "1234", '0', 2.001); 39 cin.get(); 40 }
- 类型一致函数模板
1 #include <iostream> 2 #include <cstdarg> 3 using namespace std; 4 5 template <class T > 6 auto add(int n, T t...) 7 { 8 va_list arg_ptr;//开头指针 9 va_start(arg_ptr, n);//arg_ptr,开始读取N个 10 T res(0);//初始化为0 11 for (int i = 0; i < n; i++) 12 { 13 res += va_arg(arg_ptr, T);//根据数据类型取出数据 14 } 15 va_end(arg_ptr); 16 return res; 17 } 18 19 void main() 20 { 21 cout << add(4,1.1, 2.1, 3.2, 5.0) << endl; 22 cin.get(); 23 }