2.类型不一致可变参数模板与类型一致函数模板

Posted 喵小喵~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

     

以上是关于2.类型不一致可变参数模板与类型一致函数模板的主要内容,如果未能解决你的问题,请参考以下文章

跨编译器的诊断不一致,用于缩小非类型模板参数中的转换

深入了解C++:auto与函数模板之推导规则辨析

python-函数可变参数类型

C/C++中的可变参数和可变参数模板

C++中的可变参数模板

从结构中获取所有可变参数模板类型,该结构是函数模板中的类型参数