C++11_可变参数模版

文章目录

  • 前言
  • 一、可变参数模版是什么?
  • 二、如何使用可变参数模版
    • 1.怎么解析可变参数模版
    • 2.可变参数模版的实际应用
  • 总结


前言

C++11 ,添加了许多有用的功能,上章我们主要讲解了右值引用,这章我们来讲解可变参数模版的使用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、可变参数模版是什么?

示例代码如下:

以往我们见过这样的可变参数列表
在这里插入图片描述

而C++11则引入了可变参数模版

template<class ...Args>
void Func(Args... args)
{
	cout << sizeof...(args) << endl;  //可以通过sizeof这样的语法格式来查看args包有几个参数
}
int main()
{
	string str = "hello world";
	Func(1);
	Func(1, 'a', 2);
	Func(1, 'a', str);
	return 0;
}

在这里插入图片描述这里的Args是类型名,args是类型对象,也是可变参数包,里面可以包含着0~n个参数。

二、如何使用可变参数模版

1.怎么解析可变参数模版

对于可变参数模版的解析,从现在步入C++11开始,我们就可以明显感觉到C++与之前似乎有些不同了,它的新添加的功能使用与我们之前转换了一种新的风格。

如果要解析可变参数包,可以使用递归函数的方式来解析。

代码如下(示例):

void _Func()
{
	cout << endl;
}

template<class T, class ...Args>
void _Func(const T& data, Args ...args)
{
	cout << data << " ";
	_Func(args...);
}

template<class ...Args>
void Func(Args... args)
{
	cout << sizeof...(args) << " ";  //可以通过sizeof这样的语法格式来查看args包有几个参数
	_Func(args...);
}

int main()
{
	string str = "hello world";
	Func(1);
	Func(1, 'a', 2);
	Func(1, 'a', str);
	return 0;
}

在这里插入图片描述

2.可变参数模版的实际应用

可变参数模版,最多使用于库里面,日常生活中我们很少会去使用可变参数模版,除非你要去实现一个库函数,例如在C++11之后,容器基本都添加了一个emplace_back的函数
在这里插入图片描述
它的用法与push_back相同,但是在应用方面比push_back更有优势!

下面我们就来看一段代码

代码如下(示例):
在这里插入图片描述
如果使用push_back,由于我们的vector的模版T是pair,我们在第一个push_back加上一个{}进行pair的隐式类型转换才能成功插入.
而第二个push_back,因为其vector没有该构造函数所以直接编译错误。
第二个emplace_back,因为是可变参数列表,没办法识别{2,“李四”}这个类型,所以编译报错。

那emplace_back,做了什么处理? 它没有进行任何的隐式类型转换,也就说明减少了一次构造,**(再结合我们上章内容讲的右值引用,发生隐式类型转换就说明这是一个匿名对象,对于匿名对象我们通常就会去走右值引用的移动构造)**所以emplace_back采用的可变参数模版的方式,就可以减少隐式类型转换的构造,直接在底层函数进行直接构造,在这种情况下,如果类型足够复杂可以提高程序效率,并且在底层不断使用forward(x)不断保持其原有的左右值属性,最后再去new 可变参数包里的所有类型,然后根据左右值该进行拷贝构造的进行拷贝构造,该进行移动构造的进行移动构造。(十分复杂)


总结

对于可变参数模版的理解,我们还是要自己手动去练习,这样才能更好的理解与运用它,不过也不必过于深究,仅需了解即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring之循环依赖底层源码(一)

文章目录 一、简介1. 回顾2. 循环依赖3. Bean的生命周期回顾4. 三级缓存5. 解决循环依赖的思路 二、源码分析三、相关问题1. Async情况下的循环依赖解析2. 原型Bean情况下的循环依赖解析3. 构造方法导致的循环依赖解析 一、简介 1. 回顾 前面首先重点分析了Spring Bean的整个…

如何使用 CMake 生成一个静态库

文章目录 tutorial_3/CMakeLists.txttutorial_3/src/CMakeLists.txtcmake_tutorial/tutorial_3/src/hello.cpptutorial_3/src/hello.h根目录的 CMakeLists.txtsrc 目录的 CMakeLists.txthello.cpp 和 hello.h构建过程总结 tutorial_3/CMakeLists.txt cmake_minimum_required(V…

excel3基础图标与透视图表的制作

业务需求1 给逾期金额也加上条形图,同时制作各个城市的逾期发展趋势 思路&#xff1a; 操作顺序&#xff1a;选中3列数据&#xff08;8月上旬逾期金额、8月中旬逾期金额和8月下旬逾期金额&#xff09;–开始–条件格式–数据条–渐变填充&#xff08;第5个&#xff09;&#xf…

厦门大学OpenHarmony技术俱乐部开创“1+N”新模式,加速推动产学研融合

12月29日,OpenHarmony技术俱乐部再添重将——在多方见证下,厦门大学OpenHarmony技术俱乐部在翔安校区益海嘉里楼报告厅正式揭牌成立,现场出席领导及师生代表近千人。 成立仪式现场 OpenHarmony技术俱乐部 携手厦门大学共绘开源生态新图景 OpenHarmony是由开放原子开源基金…

STM32F407ZGT6时钟源配置

1、26M外部时钟源 1、25M外部时钟源

cmd命令启动C# windows服务程序

因为Process.Manage.Service.exe程序为Windows服务程序&#xff0c;不能直接双击打开&#xff0c;所以需要借助windows系统自带InstallUtil.exe程序来启动它。 以管理员身份运行cmd命令控制台窗口 输入命令进入到InstallUtil.exe程序所在的文件夹 cd C:\Windows\Microsoft.NET…

[SAP ABAP] ABAP基础语法

ABAP(Advanced Business Application Programming)是一种编程语言&#xff0c;用于SAP软件的开发和定制 SAP ABAP是一种高级语言&#xff0c;主要用于在SAP平台上为大型企业和金融机构开发企业应用程序 1. ABAP基本语法结构 ABAP源程序由注释和ABAP语句组成&#xff0c;其中…

Linux内核组成

Linux内核的组成 /boot/vmlinuz-4.18.0-80.el8.x86_64 &#xff1a;启动时用到的内核 /lib/modules/4.18.0-80.el8.x86_64 &#xff1a;内核模块 /boot/initramfs-4.18.0-80.el8.x86_64.img &#xff1a;启动时提供必要的内核模块 kernel-core安装包里面包含了Linux内核启动…

Linux驱动学习—内核定时器

1、内核定时器 1.1 Linux内核定时器概念 不同于单片机定时器&#xff0c;LInux内核定时器是一种基于未来时间点的计时方式&#xff0c;以当前时刻来启动的时间点&#xff0c;以未来的某一时刻为终止点。比如&#xff0c;现在是10点5分&#xff0c;我要定时5分钟&#xff0c;那…

Java反射和动态代理

文章目录 1、反射1.1 反射的概述1.2 反射作用1.3 获取字节码文件对象的方式1.4 字节码文件和字节码文件对象1.5 获取构造方法1.6 获取构造方法并创建对象1.7 获取成员变量并获取值和修改值1.8 获取成员方法1.9 获取成员方法并运行1.10 反射练习1.10.1 泛型擦除1.10.2 修改字符串…

vue+nodejs微信小程序基于uniapp的学生宿舍打卡失物招领管理系统

基于微信的宿舍管理系统的设计基于现有的手机&#xff0c;可以实现等功能。方便用户对宿舍管理系统查看个人中心、失物招领管理、失物认领管理、晚归打卡管理、宿舍信息管理、宿舍更新管理、交流论坛、系统管理等功能模块的管理及详细的设计与统计分析。根据系统功能需求建立的…

网络安全法解读之思维导图

一、出台背景 二、法律基础 三、网络安全法架构 1、第一章 总则&#xff08;1-14条&#xff09; 2、第二章 网络安全支持与促进&#xff08;15-20条&#xff09; 3、 第三章 网络运行安全&#xff08;21-39条&#xff09; &#xff08;1&#xff09;第一节 一般规定 &#xf…

Linux无法启动:Timed out waiting for device dev-disk-by

由于CPU风扇问题&#xff0c;导致主机无法启动&#xff1b;鉴于机器本身比较老旧&#xff0c;因此&#xff0c;决定直接把硬盘拆下后更换到新的主机上&#xff0c;更安全可靠&#xff1b;问题却因此而起&#xff1a;把硬盘更换到新主机后&#xff0c;居然无法启动&#xff0c;开…

简易机器学习笔记(九)LeNet实例 - 在眼疾识别数据集iChallenge-PM上的应用

前言 上一节大概讲了一下LeNet的内容&#xff0c;这一章就直接来用&#xff0c;实际上用一下LeNet来进行训练和分类试试。 调用的数据集&#xff1a; https://aistudio.baidu.com/datasetdetail/19065 说明&#xff1a; 如今近视已经成为困扰人们健康的一项全球性负担&…

Windows下默认关闭数字键盘

进入注册表&#xff0c;找到值HKEY_USERS 》 .DEFAULT 》 Control Panel 》 Keyboard &#xff0c;点击 Keyboard 之后在右侧窗口中找到 InitialKeyboardIndicators&#xff0c;设置为0&#xff0c;保存&#xff0c;重启电脑 该值的意义

深信服技术认证“SCSA-S”划重点:文件包含漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

永磁同步电机的磁场定向控制

目录 概述 通过系统仿真验证行为 探索模型架构 生成用于集成到嵌入式应用程序的控制器 C 代码 指定控制器模型的参考行为 创建 PIL 实现 准备用于 PIL 测试的控制器模型 测试生成的代码的行为和执行时间 结论 此示例说明从电机控制算法生成 C 代码并验证其编译行为和执…

分布式事务完美解决方案:消息中间件(kafka)+ 本地事物 + 消息校对

前言 分布式事务是要保证多个服务下的多个数据库操作的一致性。分布式事务常见解决方案有&#xff1a;二阶段、三阶段和TCC实现强一致性事务&#xff0c;其实还有一种广为人知的方案就是利用消息队列来实现分布式事务&#xff0c;保证数据的最终一致性&#xff0c;也就是我们常…

带大家做一个,易上手的家常香干炒腊肉

从冰箱那一块腊肉 套个食品级的袋子 然后用冷水化冰 准备两块香干 香干切成片 不要太薄 当然也别厚了 一把青蒜 青蒜切成段 干和叶子分开装 腊肉去掉下面的肉皮 然后切小块 锅中加入清水 下入少量油和盐 开小火 水起泡泡后下入香干 过水 半分钟左右 香干捞出备用 将腊…

Geoserver扩展发布MySQL视图功能

Geoserver中并不自带mysql数据发布功能&#xff0c;需要扩展外部插件。 1、示例以geoserver-2.20.5版本进行演示&#xff0c;所以MySQL插件需要到该版本对应的“Extensions”标题下查找&#xff0c;下载地址&#xff1a;GeoServer&#xff0c;详见下图 2、选择MySQL进入下载页…