[modern c++][11/14] 变参模板的使用

前言:

c++ 11 引入和变参模板用来处理任意数量模板参数的场景。




变参模板函数 (C++11/14 迭代展开 | 一个模板参数和一个模板参数包)

#include <iostream>
#include <string>void MyPrint(){std::cout << "  end" << std::endl;
}template<typename FirstArgInArgs, typename... Args>
void MyPrint(FirstArgInArgs first,Args... following)
{std::cout << first << "|" ;MyPrint(following...);
}int main()
{MyPrint<std::string,int,int,long,char,double>("let's start",1,2,10000,'K',3.14);
}

运行结果

let's start|1|2|10000|K|3.14| end

需要注意的几点:

  1. 变参模板中,不能只有模板参数包(列表) Args,必须要包含一个模板参数(FirstArgInArgs)在模板参数包(Args)之前,否则会编译不通过。
  2. C++ 11/14只能使用递归的方式展开模板参数包(列表),由于使用了递归,因此需要一个递归终结条件 —— “终止函数”,当参数包长度为0的时候,这个终止函数被调用,形式为模板函数的无参数版本,比如 例子中的 void MyPrint()。这个函数必须要有且要在模板参数前面定义或提前声明。
  3. 使用 C++ 11/14 的递归方式展开参数包时,第一个模板参数 FirstArgInArgs 用来在递归场景下接收参数包里的第一个参数,以例子来说明,递归逻辑如下
  • 第一次调用  MyPrint<std::string,...>("let's start",following...) , 这里 FirstArgInArgs 用来接收 let's start 这个 string 类型。这个时候通过 std::cout << first << "|" 输出了 let's start 。这里需要注意,FirstArgInArgs 并不会被当作一个特殊的参数用来接收 let's start,而是因为其在Args之前,故而被用来为 FirstArgInArgs 服务。
  • 第二次调用 MyPrint<int,...>(1,following...),这里 FirstArgInArgs 用来接收 int , 所以 1 被输出了。
  • 第三次,第四次同理...



变参模板函数 ( C++11/14 迭代展开 | 一个固定模板参数,一个模板参数用于解包,一个模板参数包  (gstreamer里面可以用来编写 add 和 link 函数))

#include <iostream>
#include <string>template<typename element>
void MyPrint(element e)
{std::cout << "1st-" << e << std::endl;
}template<typename pipeline, typename element, typename... elementlist>
void MyPrint(pipeline p,element e,elementlist... list)
{std::cout << "2nd-" << p << std::endl;MyPrint(e,list...);
}int main()
{MyPrint<std::string,std::string,std::string,std::string,std::string,std::string>("pipeline","appsrc","filter1","filter2","filter3","appsink");
}

运行结果

2nd-pipeline
2nd-appsrc
2nd-filter1
2nd-filter2
2nd-filter3
1st-appsink

单参数模板是通用模板void MyPrint(element e),也是迭代退出的“终止函数”, 可以看到和上章节z中以无参数版本 void MyPrint() 作为 “终止函数” 不同,这里的终止函数是 有一个参数的。那么为什么有这个差别呢?

蹊跷就在于模板函数里迭代调用的那个函数,这里是 MyPrint(e,list...) ,当 list... 为空的时候,MyPrint(e,list...) 就变成了 MyPrint(e), 这恰恰就是只有一个参数的MyPrint版本。

而上一章中的 模板函数是 MyPrint(following...) , 当 following... 是空的时候, MyPrint(following...) 就蜕变成 MyPrint()了。

所以在写终止函数的时候要根据模板函数的迭代函数形式来写,不然会出现没有终止函数的情况。




变参模板类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC的概念 ,核心API的介绍 , 注册驱动介绍

第一章 JDBC 1、JDBC的概念 目标 能够掌握JDBC的概念能够理解JDBC的作用 讲解 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL&#xff1a;SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库&#xff0c;今天要学习的内容 如何通过Java代…

ubuntu server 24.04 使用记录

我安装 Ubuntu server 24.04 选择了 minimal 方式&#xff0c;发现不知道是忘记选了还是怎样&#xff0c;ssh 无法登录。 本来以为 24.04 上只会遇到和 22.04 上一样的问题&#xff0c;校网需要验证。经过几周分析研究&#xff0c;终于摸清楚了校网验证过程&#xff0c;然后写…

sed和awk

sed和awk 文章目录 sed和awksedawk grep就是查找文件中的内容&#xff0c;扩展正则表达式 sed sed是一种流编辑器&#xff0c;一次处理一行内容&#xff08;增删改查&#xff09; 如果只是展示&#xff0c;会放在缓冲区&#xff08;模式空间&#xff09;&#xff0c;展示结束…

算法社区-从零开始构建(一)

好久没动笔了&#xff0c;一是要处理的东西很多&#xff0c;二则写出来未见得深刻&#xff0c;感觉沉淀得不够&#xff0c;太浅显的东西就没必要分享。 正好最近在研究算法层面的东西&#xff0c;感觉挺受用的&#xff0c;就想着把这些东西整理出来&#xff0c;有点像社区的雏形…

问题 C: Josephus问题(Ⅰ)

问题 C: Josephus问题(Ⅰ) 题目描述 n个人排成一圈&#xff0c;按顺时针方向依次编号1&#xff0c;2&#xff0c;3…n。从编号为1的人开始顺时针"一二"报数&#xff0c;报到2的人退出圈子。这样不断循环下去&#xff0c;圈子里的人将不断减少。最终一定会剩下一个人…

高中数学:数列-解数列不等式问题的常用放缩技巧(重难点)

一、放缩技巧 技巧1 例题 证明&#xff1a;Sn&#xff1c;1 解&#xff1a; 变形 解&#xff1a; 由于第一种情况&#xff0c;我们证明了Sn&#xff1c;1&#xff0c;n≥1&#xff0c;是从第一项就开始放缩的。 发现&#xff0c;无法精确到 3 4 \frac{3}{4} 43​ 这时&am…

《2024年战略管理趋势报告》

本报告由Quantive发布。 《2024年战略管理趋势报告》这份报告深刻剖析了企业在策略管理上的当前状态、面临的挑战以及未来发展的趋势。报告指出,大多数组织在迅速适应市场变化方面存在困难,并且许多企业未能实现其战略目标,显示出策略制定与执行之间存在脱节。报告中不仅强调了…

【算法】单调队列 - 基础与应用-滑动窗口最大值

题目 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 思路 暴力&#xff1a;遍历一遍的过程中每次从窗口找到最大的数组&#…

攻防平台搭建与简易渗透工具箱编写

知识点&#xff1a;攻防平台搭建&#xff0c;虚拟机的网络模式详解&#xff0c;安全脚本编写 虚拟机的网络模式&#xff1a; 虚拟机&#xff08;VM&#xff09;的网络模式决定了虚拟机与宿主机以及外部网络之间的连接方式。不同的虚拟化平台&#xff08;如VMware, VirtualBox,…

【C语言小例程26/100】

题目&#xff1a;有一分数序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13...求出这个数列的前20项之和。 程序分析&#xff1a;请抓住分子与分母的变化规律。 程序源代码&#xff1a; #include <stdio.h>int ma…

React Suspense的原理

React Suspense组件的作用是当组件未完成加载时&#xff0c;显示 fallback 组件。那么 Suspense 是如何实现的呢&#xff1f;React 的渲染是通过 Fiber 进行的&#xff0c;Suspense 的更新机制也是要围绕 Fiber 架构进行的。Suspense 是由两部分组成&#xff0c;实际 UI 子组件…

CAN通讯时序仲裁 【AI解答】

问&#xff1a; 1.CAN协议总线和节点时序同步如何理解 答 简单理解&#xff1a;总线上的时钟变化需要和节点上的时钟变化一致 当我们谈论CAN协议总线和节点时序同步时&#xff0c;我们实际上是在谈论如何确保在一个复杂的系统中&#xff0c;多个节点之间能够正确地进行数据…

如何在Springboot中添加事务执行?(以MySQL为例)

目录 1. 添加依赖 2. 配置数据库连接 3. 启用事务管理 4. 创建实体类和存储库 5. 创建服务类并使用Transactional注解 6. 编写测试用例 7. 运行应用程序 在Springboot中开启数据库的事务的应用开发过程中非常重要的业务&#xff0c;以下是一个使用MySQL数据库&#xff0…

Spring Cloud 常用组件——Hystrix(上)

在微服务架构中&#xff0c;服务之间的依赖关系非常复杂&#xff0c;一个服务的故障可能会导致整个系统的级联失败。Hystrix 是 Netflix 开源的一个容错库&#xff0c;它通过隔离服务之间的访问点、添加延迟容忍和容错逻辑来防止系统故障的蔓延。在这篇文章中&#xff0c;我们将…

0803功放3

1.甲乙类互补堆成功放&#xff0c; 理想12v t提供静态偏置&#xff0c;消去交越失真 2.12V Po(12)2/2RL 3.电压并联负反馈 并联减小输入电阻 电压减小输出电阻 4.-Rf/Ri 这个问题是工艺问题引起的&#xff0c;最早用PNP管用的锗管&#xff0c;后面硅工艺成熟后用的就是硅管&…

毫米波移动通信系统中的波束赋形— 基于码本的波束训练

基于码本的波束训练算法该方法在收发端都配置波束矢量的码本&#xff0c;通过波束搜索的方式发现最优的波束方向为了加快波束搜索的速度&#xff0c;往往采用逐步缩小搜索范围的方式加快搜索&#xff0c;可以将搜索算法的时间复杂度从O(N)降低到O(logN)&#xff0c;其中N表示码…

Huffman算法:原理、实现与应用

Huffman算法是一种非常有效的数据压缩算法&#xff0c;它的核心思想是利用字符在源数据中的出现频率来构建一棵Huffman树&#xff0c;从而实现对字符的重新编码。编码过程中&#xff0c;频率越高的字符将获得越短的编码&#xff0c;而频率越低的字符将获得越长的编码。这样&…

信创里程碑:TapData 人大金仓数据库产品完成兼容互认证,携手推进自主创新建设

近日&#xff0c;深圳钛铂数据有限公司&#xff08;以下简称钛铂数据&#xff09;自主研发的钛铂实时数据平台&#xff08;TapData Live Data Platform&#xff0c;TapData LDP&#xff09;与北京人大金仓信息技术股份有限公司&#xff08;以下简称“人大金仓”&#xff09; Ki…

基于单片机的智能浇花系统设计与实现

摘要: 设计了一种智能湿度感应浇花系统 。 系统以单片机 AT89S52 为控制芯片&#xff0c;利用 SLHT5-1 土壤湿度传感器来检测土壤的相对湿度&#xff0c;再通过单片机进行信息处理&#xff0c;采用模糊控制方法&#xff0c;输出控制信号&#xff0c;控制继电器的动作&…

代码随想录训练营第十八天 530二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先

第一题&#xff1a; 原题链接&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 使用中序遍历的方式&#xff1a;左中右。 定义一个pre节点来存放当前节点的前一个节点。 在中序的时候处理递归逻辑&#xff1a; 首先先向…