首页 > 编程语言 >[c++11新特性]07-可变参模板

[c++11新特性]07-可变参模板

时间:2022-12-06 16:32:32浏览次数:56  
标签:11 ... 07 递归 args c++ 参数 print 模板

可变参模板

  • ​​简介​​
  • ​​递归模板函数​​

简介

可变参模板是c++11引入的特别重要的一个特性,和 c 语言中的可变参一样,也是使用 ... 来表示的,如下:

template <typename ... Args>
void print(Args ...args)
{

}

上面的模板函数print可以接收任何类型、任何个数的对象作为实参,例如:

print<int,double,std::string,std::tuple>(10,18.8,"change",std::make_tuple<int,std::string,double>(88,"desk",19.9));

既然是任意形式,所以个数为 0 的模板参数也是可以的,如果不希望产生的模板参数个数为0,可以手动的定义至少一个模板参数:

template <typename T,typename ...Args>
void print(T t,Args ...args)
{

}

那么,具体该如何实现一个可变参的print呢?我们要做的第一个事情就是将 args 参数解包成具体的类型参数,比如将 args 解包成 int,double,std::string 类型的对象。对参数进行解包,到目前为止还没有一种简单的方法能够处理参数包,但有两种经典的处理手法:

  • 递归模板函数:先处理第一个参数,然后递归调用模板函数,并且提供一个终止模板函数
  • 变参模板展开:在c++17中引入

递归模板函数

递归是非常容易想到的一种手段,也是最经典的处理方法。这种方法不断递归地向函数传递模板参数,进而达到递归遍历所有模板参数的目的:

#include<iostream>
template<typename T0>
void printf1(T0 value)
{
std::cout << value << std::endl;
}

template<typename T,typename...Ts>
void printf1(T value,Ts... args)
{
std::cout << value << std::endl;
printf1(args...);
}

int main()
{
printf1(1,2,"123",1.1);
return 0;
}

这里你需要提供一个终止模板函数,以便在解包的过程中知道什么时候可以结束。

标签:11,...,07,递归,args,c++,参数,print,模板
From: https://blog.51cto.com/u_6650004/5916379

相关文章

  • C++ 之 cout 格式化输出
    写代码时每次用到格式化输出就各种搜来搜去,今天好好整理一下,方便以后查阅和使用。参考链接:C++之cout使用攻略C++格式化输出首先,加上头文件#include<iomanip>,......
  • W11中使用VScode远程开发之宝塔用户自动登录
    宝塔面板开启ssh,加密方式选择rsa下载秘钥,放值目录:C:\Users\本机用户\.ssh修改该目录下的config文件Host111.112.113.114HostName111.112.113.114UserrootF......
  • UEC++ 会话暴露给蓝图 ,无法识别会话相关类型
    在实在联网功能时,我们常常需要获取到会话类型,当我们需要在蓝图中使用这些类型的时候。如果我们直接在头文件中直接使用会话相关类型在编译时就会报错Unrecognizedtype......
  • Oracle错误——ORA-03113:通信通道的文件结尾 解决办法
    该错误我是还原数据库之后出现的建议的问题跟进方法是先查看oracle的日志,查看的方法select*fromv$diag_info 先看日志文件存储在哪,根据路径找到文件查看文件内容......
  • C/C++饮品自动贩卖机系统
    C/C++饮品自动贩卖机系统该饮品自动贩卖机总容量确定,且贩卖机内通道宽度并排只能容纳一个饮品,购买饮品出口和添加饮品口在同一个位置。经营者添加饮品时,每次只能添加一个......
  • C++校园导游程序及通信线路设计
    C++校园导游程序及通信线路设计一、设计内容:设计校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相......
  • Semaphore信号量源码解析(基于jdk11)
    目录1、Semaphore信号量源码解析(基于jdk11)1.1Semaphore概述1.2Semaphore的原理1.2.1基本结构(jdk11)1.2.2可中断获取信号量1.2.3公平模式1.2.4非公平模式1.2.4不......
  • C/C++ 新生入学管理系统
    C/C++新生入学管理系统4、新生入学管理系统问题描述:通过此系统可以实现如下功能:(1)用户登录,用户分为管理员和新生两种不同角色功能不同。(2)管理员模块功能:管理员......
  • CyclicBarrier循环屏障源码解析(基于jdk11)
    目录CyclicBarrier循环屏障源码解析(基于jdk11)1.1CyclicBarrier概述1.2CyclicBarrier原理1.2.1基本结构(jdk11)1.2.2await()方法1.2.3dowait方法1.2.3.1breakBarrie......
  • C++工资管理系统
    C++工资管理系统课程设计六工资管理系统[要求]该系统在磁盘上存储了某单位上月全体职工的工资信息。对于每一位职工存储以下信息:月份、职工编号、基本工资、津贴、岗......