//类型不一致函数模板
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 }