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 }

原文地址:https://www.cnblogs.com/xiaochi/p/8543490.html

时间: 2024-10-05 05:08:25

2.类型不一致可变参数模板与类型一致函数模板的相关文章

第20课 可变参数模板(1)_模板参数包和函数参数包

1.  参数包(parameter pack) (1)模板参数包(以tuple为例):template<typename- Elements>class tuple ①Elements标识符的左侧使用了省略号,在C++11中Elements被称为"模板参数包",表示可以接受任意多个参数作为模板参数. ②编译器将多个模板参数打包成"单个"的模板参数包,如tuple<int, char, double>实例化模板类时,Element就是包含int

第21课 可变参数模板(2)_展开参数包

1. 可变参数模板函数 (1)递归函数方式展开参数包 ①一般需要提供前向声明.一个参数包的展开函数和一个递归终止函数. ②前向声明有时可省略,递归终止函数可以是0个或n个参数 (2)逗号表达式和初始化列表方式展开参数包 ①逗号表达式按顺序执行,返回最后一个表达式的值. ②initilizer_list可接受任意多个不同类型的参数. ③借助逗号表达式来展开包,并将返回的结果用于初始化initilizer_list. [编程实验]展开可变参数模板函数的参数包 #include <iostream>

检测空值,以及会不会出现mapping类型不一致的问题

/// <summary> /// 检测空值,以及会不会出现mapping类型不一致的问题 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="nullsb1"></param> /// <param name="errorsb"></param> public st

可变参数模板用法

//可变参数模板 //可变参数模板,可以创建可接受可变数量参数的模板函数和模板类 //本程序通过模板函数来实例一下可变参数模板的基本用法 #include<iostream> using namespace std; void one(){}//当最后一个参数传完后,需要一个无参的重载版本 template <typename T>//当只剩最后一个参数时,编译器优先选择此模板,这样最后一个输出后面就没有逗号了 void one(T v) { cout << v <

c++11可变参数模板的使用1

1.概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进.然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一. 虽然掌握可变模版参数有一定难度,但是它却是C++11中最有意思的一个特性,本文希望带领读者由浅入深的认识和掌握这一

C++反射机制:可变参数模板实现C++反射

1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在coding.net的仓库地址.   C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.关于可变参数模板的原理和应用不是本文重点,不过通过本文中的例子也可充分了解可变参数模板是如何应用的.

50套html网站模板,涵盖很多行业,各种类型html网站,各种行业html网站模板下载

收到自己买的STM32F103ZE为主芯片的开发板,标志着我正式进入实践阶段,之前看了不少ARM的资料,都是零零散散的,也没有什么系统的总结,总觉得找到真正的感觉,就下决心买开发板,至于为什么选择STM32,很简单,适合自己.好了,废话少说,以下是我今天收到开发板后的学习总结. 由于还不清楚什么如何运作,就按照提供的资料的视频一步一步做: 第1步:上电检测开发板是否正常. 第2步:安装驱动和软件. 驱动:JLINK驱动---用于仿真调试用. CH340驱动(USB串口驱动)-----用于开发板与

05 基元类型、引用类型和值类型

基元类型 书上一开头就说了一个概念 编译器直接支持的数据类型称为基元类型(primitive type). 以下是基元类型. C# Primitive Typ FCL Type CLS-Compliant sbyte System.SBte NO byte System.Byte YES short System.Int16 YES ushort System.UInt16 NO int System.Int32 YES uint System.UInt32 NO long System.Int

Atitit.变量的定义&#160;获取&#160;储存&#160;物理结构&#160;基本类型简化&#160;隐式转换&#160;类型推导&#160;与底层原理&#160;attilaxDSL

Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL 1.1. $ 美元字符, php 黑头1 1.2. 默认变量的范围和声明:1 1.3. 变量的存储,储存在变量池里Map(varName,varVal)1 1.3.1. 复合变量1 1.4. 变量类型简化: 字符串 数字,  bool1 1.5. 变量自动隐式转换2 1.6. 类型推导2 2. 参考 复合变量2 1.1. $ 美元字符, php 黑头 1.2. 默认变量的范围和声明