C++_可变参数模板

       

目录

1、可变参数模板的用法

2、参数包展开

2.1 递归方式展开

2.2 逗号表达式形式展开 

3、参数包的大小

结语 


前言:

        C++11引入了可变参数模板,他的作用是可以让创建的函数模板或者类模板的模板参数可以接收任意数量参数,在C++11前,只能手写固定数量个模板参数,并且只能接收与之对应数量的参数,有了可变参数模板后,代码就变得更加的灵活了。

1、可变参数模板的用法

        可变参数必须是搭配着模板使用的,具体写法如下:

// Args是一个模板参数包,args是一个函数形参参数包
// 声明一个参数包Args...args,这个参数包中可以接收多个实参。
template <class ...Args>
void ShowList(Args... args)
{}

         可以发现,可变参数模板的写法非常特殊,需要先创建一个模板,并且该模板的参数需要用三个点:’...‘来声明,如上代码,Args就成了一个模板参数包,再用该模板参数去作为args的类型,则args为函数形参参数包,这一类args就可以接收多个实参了(可接收0~n个参数,n>=0)。

2、参数包展开

        虽然args可以接收多个参数,但是无法直接读取这些参数的内容,因此最重要的一步是将args参数包中的内容展开并读取到里面的数据,这也是可变参数模板的一个难点——参数包的展开。

2.1 递归方式展开

        采用类似于递归的方式进行参数包的展开(注意调用参数包的写法),具体代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>
using namespace std;template <class T>
void ShowList(const T& t)
{cout << t << endl;
}template <class T, class ...Args>
void ShowList(T value, Args... args)//函数重载
{//展开参数包cout << value << " ";ShowList(args...);//当只剩下一个参数时会走第一个ShowList
}
int main()
{ShowList(1, 'A', string("hello world"));return 0;
}

         运行结果:

        具体流程如下图所示:

2.2 逗号表达式形式展开 

        除了上述的递归方式,还可以把参数包放到一个数组里, 写法如下:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>
using namespace std;template <class T>
void PrintArg(T t)
{cout << t << " ";
}template <class ...Args>
void ShowList(Args... args)
{int arr[] = { (PrintArg(args), 0)... };//特殊的写法cout << endl;
}
int main()
{ShowList(1, 'A', "hello world");return 0;
}

        运行结果:

        具体过程:{(printarg(args), 0)...}将会展开成((printarg(arg1),0), (printarg(arg2),0), (printarg(arg3),0), etc... ),因为是逗号表达式,所以先执行逗号前面的内容,即(printarg(args),因此会先去调用函数printarg,也就是说在构造arr数组的过程就将参数包展开了,并且该数组arr的全部元素都是0(因为逗号表达式的结果取最后一个),该数组的大小是参数包的大小,并且参数包中有多少个参数就有多少个元素0,数组的最终结果应该是:arr[sizeof...(args)] = {0,0,0..}。

3、参数包的大小

         参数包的大小即该参数包里总共有多少个参数,与参数的类型无关,只与个数有关,示例代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>
using namespace std;template<class ...Args>
void func(Args... args)
{cout << __FUNCTION__ << ":" << sizeof...(args) << endl;//注意求参数包的写法
}int main()
{func();//一个参数没有则参数包为0func('A', "hello world");//两个参数,参数包为2func(1,'A',"hello world");//三个参数,参数包为3return 0;
}

        运行结果:

        此处注意计算参数包的写法。 

结语 

        以上就是关于可变参数模板的讲解,比如当我们不知道要传多少个参数给到模板时,这类场景下就可以使用可变参数模板了,该模板参数可以接收任意数量个参数,然后再用特殊的写法将其内容展开就可以读取到参数包里的数据了。

        最后希望本文可以给你带来更多的收获,如果本文对你起到了帮助,希望可以动动小指头帮忙点赞👍+关注😎+收藏👌!如果有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!! 

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

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

相关文章

微信小程序-自定义简易顶部导航

创建component文件夹 创建navigation文件夹&#xff0c;创建navigation组件 navigation.json {"component": true,"usingComponents": {} }navigation.wxml <view class"navigation"><van-icon wx:if"{{showBack}}" custom…

C语言初学10:typedef

一、作用 为用户定义的数据类型取一个新名字 二、对结构体使用typedef定义新的数据类型名字 #include <stdio.h> #include <string.h>typedef struct Books //使用 typedef 来定义一个新的数据类型名字 {char title[50];} book;int main( ) {//book是typedef定…

【Scrapy】京东商品数据可视化

【Scrapy】京东商品数据可视化 文章目录 【Scrapy】京东商品数据可视化  &#x1f449;引言&#x1f48e;一、爬取数据&#xff1a;1.1 scrapy爬虫库简介&#xff1a;1.2 技术实现&#xff1a;1.2.1搭建框架结构1.2.2 分析网页结构 二、数据保存&#xff1a;三、数据读取以及…

回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.M…

使用scrapy爬取蜻蜓FM

创建框架和项目 ### 1. 创建虚拟环境 conda create -n spiderScrapy python3.9 ### 2. 安装scrapy pip install scrapy2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架并进入框架 scrapy startproject my_spider cd my_spider### 4. 生成项目 scrapy …

DFS例题(n皇后问题)C++(Acwing)

代码&#xff1a; #include <iostream>using namespace std;const int N 20;int n; char g[N][N]; bool col[N], dg[N], udg[N];void dfs(int u) {if(u n){for(int i 0; i < n; i) puts(g[i]);puts("");return; }for(int i 0; i < n…

[java入门到精通] 19 网络编程,设计模式

今日目标 网络编程 TCP通信 Junit单元测试 单例设计模式 多例设计模式 工厂设计模式 1 网络编程 1.1 软件架构 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结构。常见程序有&#xff31;&#xff31;、迅雷等软件B/S结构 &#xff1a…

C/C++关键字详解-----`const`的使用

作为一个关键词&#xff0c;你可以将 const 视为对数据的权限控制机制之一&#xff0c;它主要用于限制数据的可变性&#xff0c;从而提高代码的安全性和可靠性。通过使用 const&#xff0c;可以缩小对数据的修改权限&#xff0c;确保数据在某些情况下不被意外修改。 而根据使用…

【Python数据结构与判断1/7】复杂的多向选择

目录 导入 举个栗子 代码优化 elif 栗子 执行顺序 情况一 情况二 情况三 if-elif-else特性 三种判断语句小结 if if-else if-elif-else 嵌套语句 if嵌套 栗子 执行顺序 相互嵌套 Tips Debug 总结 导入 在前面&#xff0c;我们学习了单向选择的if语句和多项…

第四节:SashulinMessageBroker的团队协作

SMB工程可以通过git或svn等工具进行管理。除此外&#xff0c;SMB也提供了云代码管理功能。实际效果如图&#xff1a; 一、准备工作 1、代码管理相关的表结构 以下是云代码管理表结构&#xff0c;在mysql中运行。 -- Create syntax for TABLE sc_flow CREATE TABLE sc_flow (…

数据结构与算法:链式二叉树

上一篇文章我们结束了二叉树的顺序存储&#xff0c;本届内容我们来到二叉树的链式存储&#xff01; 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序&#xff0c;中序&#xff0c;后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…

《软件安装与使用教程》— Git 在Windows的安装教程

目录 Git在Windows安装教程1 获得安装包2 解压文件3 注意事项4 安装步骤4.1 运行安装程序4.2 声明许可4.3 选择安装路径4.4 选择需要安装的组件4.5 选择开始菜单4.6 选择默认编辑器4.7 选择PATH环境4.8 选择HTTPS后端传输4.9 配置行尾巴符转换4.10 配置Git Bash终端仿真器4.11 …

NLP 算法实战项目:使用 BERT 进行模型微调,进行文本情感分析

本篇我们使用公开的微博数据集(weibo_senti_100k)进行训练&#xff0c;此数据集已经进行标注&#xff0c;0: 负面情绪&#xff0c;1:正面情绪。数据集共计82718条(包含标题)。如下图&#xff1a; 下面我们使用bert-base-chinese预训练模型进行微调并进行测试。 技术交流&#x…

STC89C52串口通信详解

目录 前言 一.通信基本原理 1.1串行通信与并行通信 1.2同步通信和异步通信 1.2.1异步通信 1.2.2同步通信 1.3单工、半双工与全双工通信 1.4通信速率 二.串口通信简介 2.1接口标准 2.2串口内部结构 2.3串口相关寄存器 三.串口工作方式 四.波特率计算 五.串口初始化步骤 六.实验…

Python虚拟环境搭建

一、下载安装Anaconda Anaconda官网&#xff0c;下载完成后一路next安装完成即可。 二、使用Anaconda &#xff08;Windows最好配合ConEmu,cmder等非原装cmd使用&#xff09; 查看版本&#xff1a;conda env list 查看已存在的镜像源&#xff1a;conda config --show chann…

万界星空科技MES系统中的车间管理的作用

在了解mes生产管理系统的作用包括哪些方面之前&#xff0c;我们先来了解一下作为生产管理信息化的关键部分&#xff0c;车间管理系统包含哪几个部分&#xff1a;一、mes系统中的车间管理通常包含以下部分&#xff1a; 1、设备管理&#xff1a;用于监控车间内的设备状态&#xf…

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日&#xff0c;全国网络安全标准化技术委员会&#xff08; TC260 &#xff09;正式发布《生成式人工智能服务安全基本要求》&#xff08;以下简称《基本要求》&#xff09;。《基本要求》规定了生成式人工智能服务在安全方面的基本要求&#xff0c;包括语料安全、模…

游戏中主流的护甲计算

文章目录 1、护甲1.1、主流的护甲函数1.2、护甲穿透1.3、护甲穿透&#xff08;按百分比&#xff09;1.3、格挡 2、攻速和DPS3、暴击3.1、暴击率3.2、暴击伤害 4、最后一题 1、护甲 1.1、主流的护甲函数 当护甲>0时&#xff0c;护甲函数如下&#xff1a; 伤害减免 1 − 1 …

springboot整合shiro的实战教程(二)

文章目录 整合思路1.创建springboot项目2.引入依赖3.创建Shiro Filter0.创建配置类1.配置shiroFilterFactoryBean2.配置WebSecurityManager3.创建自定义Relm4.配置自定义realm5.编写控制器跳转至index.html6.加入资源的权限控制7. 常见过滤器 登录认证实现登录界面开发controll…

目标网站屏蔽右键检查(使用开发者工具)

问题&#xff1a; 通过网络触手中想要获取某网站的数据出现&#xff1a;鼠标右击&#xff0c;或按ctrl F10 键 无反应&#xff08;也就是打不开类似谷歌的开发工具&#xff09; 问题同等与&#xff1a; 解决网页屏蔽F12或右键打开审查元素 引用&#xff1a; 作者&#xff…