C++11_可变参数模版

news2024/11/15 4:55:17

文章目录

  • 前言
  • 一、可变参数模版是什么?
  • 二、如何使用可变参数模版
    • 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 可变参数包里的所有类型,然后根据左右值该进行拷贝构造的进行拷贝构造,该进行移动构造的进行移动构造。(十分复杂)


总结

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

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

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

相关文章

Redis:原理速成+项目实战——Redis实战7(优惠券秒杀+细节解决超卖、一人一单问题)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战6&#xff08;封装缓存工具&#xff08;高级写法&#xff09;&&缓存总…

实验室管理系统建设方案(LIMS)

1.实验室管理系统 1.1.系统概述 需求描述 实验室管理系统通过先进的数据处理技术对实验室进行全面管理&#xff0c;促进实验室检测流程的信息化、规范化&#xff0c;同时强化实验室检测数据的组织、分析、查询和输出&#xff0c;并对实验过程中的质量因素进行严格控制。 1.1…

分布式锁3: zk实现分布式锁3 使用临时顺序节点+watch监听实现阻塞锁

一 zk实现分布式锁 1.1 使用临时顺序节点 的问题 接上一篇文章&#xff0c;每个请求要想正常的执行完成&#xff0c;最终都是要创建节点&#xff0c;如果能够避免争抢必然可以提高性能。这里借助于zk的临时序列化节点&#xff0c;实现分布式锁 1. 主要修改了构造方法和lock方…

SpringBoot2基础

SpringBoot2 一、初始化项目 ①、创建project ②、构建maven项目 如果选项里没有8的&#xff0c;可以最顶上镜像换成阿里巴巴的&#xff1a;https://start.aliyun.com/ 直接在main函数运行就行 二、SpringBoot入门 1、复制工程 原则 保留工程基础结构抹掉原始工程痕迹 做个…

Java SE入门及基础(4)

Java 中的数据类型 1.数据的概念 数据就是信息的符号表示。 比如&#xff1a; 小米手机 红米 10 元 5 年 刘德华 帅 50 188 富豪 2.数据类型 生活中我们常见的数据类型&#xff1a; Java中的数据类型分为 基本数据类型 和 引用数据类型 两大类 Java 中…

Java学习苦旅(二十四)——Java中的内部类

本篇博客将讲解Java中的内部类。 文章目录 内部类本地内部类实例内部类静态内部类匿名内部类 结尾 内部类 本地内部类 本地内部类是定义在方法当中的类。例如&#xff1a; public class Test {public void fun() {class Test {public int a;}} }本地内部类只能在当前方法中…

大数据毕业设计:新闻情感分析系统 舆情分析 NLP 机器学习 爬虫 朴素贝叶斯算法(附源码+论文)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

基于SSM的游戏资源管理系统+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

Linux第11步_解决“挂载后的U盘出现中文乱码”

学习完“通过终端挂载和卸载U盘”&#xff0c;我们发现U盘下的中文文件名会出现乱码&#xff0c;现在讲解怎么解决这个问题。其实就是复习一下“通过终端挂载和卸载U盘”&#xff0c;单独讲解&#xff0c;是为了解决问题&#xff0c;一次性搞好&#xff0c;我们会不长记性。 在…

Mac M1 Parallels Debian10 Install Gitlab

安装Debian10 Debian10百度网盘下载链接: https://pan.baidu.com/s/1ovBWIhTpljIVOxEkjJQjkQ?pwd6666 提取码: 6666 –来自百度网盘超级会员v7的分享 # 1.install # 2.localtion: 中国 → 语言: 中文&#xff08;简体&#xff09; # 3.网络 默认、自动配置 # 4.主机名域名(随意…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

总420+,专业120+南京大学851信号与系统电子信息考研经验通信,电子信息

今年考研数学130&#xff0c;专业课120&#xff0c;总分420顺利被南京大学电通录取&#xff0c;梦圆南大&#xff0c;这一年的复习有过迷茫&#xff0c;有过犹豫&#xff0c;最后都坚持过来了&#xff0c;总结一下自己的复习经验&#xff0c;希望对大家有所帮助。数学 5-8月数…

消除字母Scratch-第14届蓝桥杯Scratch省赛真题第6题

6. 消除字母&#xff08;100分&#xff09; 编程实现&#xff1a;消除字母。 具体要求&#xff1a; 1). 点击绿旗&#xff0c;角色、背景如图所示&#xff08;创建1个字母表&#xff0c;并存入26个字母&#xff09;&#xff1b; 2). 等待1秒&#xff0c;阿拉蕾说&#xff1…

深入C++继承:面向对象编程的核心概念

C是一种功能强大的编程语言&#xff0c;支持面向对象编程&#xff08;OOP&#xff09;范式。在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它使得我们能够创建具有层次结构的类&#xff0c;并实现代码的重用和扩展。本文将深入探讨C中的继承机制&#xff0c;介…

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…

freertos——任务通知知识总结与任务通知模拟及信号量实验、消息邮箱实验、事件标志组实验

1.任务通知概念 任务通知&#xff1a;用来通知任务的&#xff0c;任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值&#xff0c;不需要另外创建一个结构体可以直接接受别人发过来的通知 2.任务通知的优势及劣势 任务通知的优势&#xff1a; 效率更高 &#xff…

基于Python+Django,开发一款房屋租赁系统

学习文档 学习过程中&#xff0c;遇到问题可以咨询作者 功能介绍 平台采用B/S结构&#xff0c;后端采用主流的PythonDjango进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括&#xff1a;首页、房屋详情页、用户中心模块。…

卫星互联网与MEC融合方案研究

卫星互联网与MEC融合方案研究 作者&#xff1a;温特、王立中、司鹏、颜明明、马恬、郭伊蒙 中国卫通集团股份有限公司 本文首发&#xff1a;第十九届卫星通信学术年会 摘 要&#xff1a;在卫星互联网中引入移动边缘计算(MEC)技术可有效提高用户体验质量&#xff0c;降低运营成…

关掉RHEL 8安装软件包订阅注册

关掉RHEL订阅注册&#xff1a;&#xff08;关掉之后&#xff0c;在YUM的时候就不会有提示注册的信息了&#xff09; cd /etc/yum/pluginconf.d/ ls vim subscription-manager.conf可以看到enabled1&#xff0c;这个数值表明此时是允许订阅注册的。 此时安装软件包时&#xff…

kubectl的插件安装工具krew

最近得知一个kubectl插件安装工具&#xff0c;叫做krew。 官网地址是&#xff1a;Krew – kubectl plugin manager 安装krew 按照官网的做法&#xff0c;一直安装失败&#xff0c;于是拆解步骤&#xff0c;一步一步下载离线安装。 1、下载krew.yaml 地址&#xff1a;https:…