波奇学C++:C++11的可变参数模板和emplace

2023-12-04

可变参数模板

// args是参数包
template<class T,class ...Args>
void _ShowList(T value, Args... args)
{
	cout << sizeof...(args) << endl; // 2
	cout << value << " ";
	/*_ShowList(args...);*/
	
}
int main()
{
    _ShowList(1,2,3); 
    return 0;
}

可变参数类型模板指的是参数的类型和数量是可变的。在上面的代码,Args是个参数包可以接收多个多个参数。底层是以数组接收参数。

如何查看参数包args中的参数。args的范围是0到1。

template<class T>
void _ShowList(T val)
{
	cout << val << " ";
	cout << endl;
}

template<class T,class ...Args>
void _ShowList(T value, Args... args)
{
	cout << sizeof...(args) << endl;
	cout << value << " ";
	_ShowList(args...);
	
}

通过函数重载,一个个参数拿出来看。

方式二

template<class T>
int PrintArg(T t)
{
	cout << t << " ";
	return 0; 
}
template<class ...Args>
void CppPrint(Args... args)
{
	int a[] = { PrintArg(args)... };
}
int main()
{
	CppPrint(1,2,3,4,5,6);
	return 0;
}

这个的原理是PrintArg(args)... 会扩展看来相当于下面

int a[]={PrintArg(1), PrintArg(2), PrintArg(3),PringArg(4),...};

可变模板参数模板在初始化对象的使用

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "构造函数";
	}
private:
	int _year;
	int _month;
	int _day;
};
template<class ...Args>
Date* create(Args... args)
{
	Date* p = new Date(args...);
	return p;
}
int main()
{
	create(1, 0, 9);
	return 0;

}

在上面的代码中 create函数接收的1,0,9的值存进了args,args...拓展出来分别初始化对应参数。

容器的emplace接口的参数就是可变参数模板。

我们可以看到mylist.emplace_back只调用了string的构造函数,而mylist.push_back()只能先调用了string构造出pair,pair进行insert再进行push_back再进行移动拷贝构造。

实际上因为右值引用,所以其实emplace和push效率上没有太大区别。

默认的移动构造函数生成

针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下:

如果你没有自己实现移动构造函数,且没有实现 析构函数、拷贝构造、拷贝赋值重载 中的任意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类型成员会执行逐成员按 字节拷贝 ,自定义类型成员,则需要看这个成员是否实现 移动构造 ,如果实现了就调用移动构造,没有实现就调用 拷贝构造

如果你没有自己实现移动赋值重载函数,且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个,那么编译器会自动生成一个默认移动赋值。默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。(默认移动赋值跟上面移动构造完全类似)

如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。


class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "构造函数";
	}
	Date(Date&& p) = default; //强制生成移动构造
	Date(const Date& p) = default; //强制生成拷贝构造
private:
	int _year;
	int _month;
	int _day;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

波奇学C++:C++11的可变参数模板和emplace 的相关文章

  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 解读拼多多Q3财报:Temu崭露头角,跨境故事刚刚开场

    11月28日 拼多多发布了2023年第三季度的业绩报告 季度营收688 4亿元 较去年同期大涨94 比市场预期高出100多亿元 截止到11月28日美股收盘 拼多多股价上涨18 8 总市值达到1834 23亿美元 11月29日美股开盘后 拼多
  • pymysql.err.DataError: (1366, “Incorrect string value: ‘\\xC2\\xA0\\xE5\\x89\\xA7\\xE6...‘ for colum

    pymysql err DataError 1366 Incorrect string value xC2 xA0 xE5 x89 xA7 xE6 for column types at row 1 怎么解决 这个错误通常是由于在尝试将一个
  • 手机没Root?你照样可以渗透路由器

    和Metasploit差不多 RouterSploit是一个强大的漏洞利用框架 用于快速识别和利用路由器中的普通漏洞 它还有个亮点 就是可以在绝大多数安卓设备上运行 如果你想在电脑上运行 可以阅读这篇文章 而这篇教程则会告诉你如何轻松地在未
  • 【Linux】 服务器优化之定时任务:自动清理日志,重启服务

    文章目录 背景 处理流程 查看进程 清理日志文件 重启服务 问题总结 完整处理方案 清理日志脚本 自动重启服务
  • ECU Bootloader程序开发

    文章目录 前言 前言 本篇主要介绍ECU BootLoader的 一般 开发逻辑 对正在 或想要做这方面工作的小伙伴一个参考 BootLoader的稳定性至关重要 前期设计要规避可能存在的所有使ECU变 砖 的风险点 尽可能地设计多重防范机
  • Transformer

    目录 Encoder LayerNorm怎么做的 Feed Forward FeedForward代码 公式 FeedForward的作用是什么 Decoder output 它的output 是什么 为什么output要进行shifted
  • 钛及钛合金材料的性质和应用-科学指南针

    一 钛的性质 这类气体是对金属钛十分有害的杂质 即使含量甚微 0 01 0 005 也能严重影响它的力学性能 钛的力学性质即通称的机械性能与纯度十分相关 高纯钛具有优良的机加工性能 延伸率 断面收缩率均佳 但强度低 不适合作结构材料 工业纯
  • 八爪鱼RPA机器人抖音达人合作邀约沟通

    让沟通变得简单粗暴的抖音达人合作邀约沟通rpa机器人 在当前的抖音达人合作邀约沟通行业中 存在着许多问题 首先 沟通过程中常常出现信息不准确 传达不清晰的情况 导致合作双方产生误解 影响合作的顺利进行 其次 沟通的过程中需要花费大量的时间和
  • 照片拼图软件哪些值得推荐?制作创意拼贴画

    你是否厌倦了单调的照片展示方式 你希望让你的照片更加有趣 更具创意吗 这时候你就需要一个拼图软件了 这种软件可以帮助你将多张照片拼贴在一起 从而制作出独特的拼贴画 通过这种软件 你可以轻松地调整照片大小 位置和角度 实现你想要的创意效果 同
  • 数说CS | 拟录取名额稳定,直博减少?保研清华大学软件学院难吗?

    写在前面 清华大学软件学院 首批全国示范性软件学院之一 招收哪些专业 保研录取情况如何 今天 岛主就带你 深度揭秘清华大学软件学院 01 院校介绍 清华大学软件学院是2001年经国家教育部和国家计委联合发文批准成立的首批全国示范性软件学院之
  • 手机话筒的安全性:风险与防范措施

    随着科技的快速发展和人们生活节奏的加快 手机已经成为我们日常生活中不可或缺的一部分 然而 手机话筒作为手机的主要部件之一 其安全性问题却往往被人们忽视 本文将围绕手机话筒的安全性进行探讨 分析可能存在的风险 并提出相应的防范措施 一 手机话
  • 2024 信息安全专业毕业设计(论文)选题合集 最新版

    目录 前言 信息安全选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研
  • 网站漏洞怎么修复代码漏洞

    jeecms 最近被爆出高危网站漏洞 可以导致网站被上传webshell木马文件 受影响的版本是jeecms V6 0版本到jeecmsV7 0版本 该网站系统采用的是JAVA语言开发 数据库 gt https cloud tencent
  • OpenHarmony 设备启动Logo和启动视频替换指南

    前言 OpenHarmony源码版本 4 0release 开发板 DAYU rk3568 一 Logo替换 替换其中的logo bmp 和 logo kernel bmp文件 注意事项 1 图片的分辨率需要和设备匹配 2 如果是非首次编译
  • 文字配音怎么制作的?让文字生动起来

    文字配音工具是一种将文字转化为语音的软件 它能够让文字以声音的形式呈现给听众 这种工具通常被用于阅读电子书 听新闻 看文章等方面 也可以帮助视觉障碍者更好地理解文字内容 文字配音工具一般具有多种语音选项和声音效果 可以让使用者自由选择适合自
  • 活动报名|JARVIS-1:开放世界自主智能体的构建

    王子豪 北京大学智能学院博士生 导师为梁一韬教授 曾获国家奖学金 北京市优秀毕业生等荣誉 主要研究方向为开放世界下多任务智能体的构建 尤其关心基于基础模型的智能体的泛化能力 近年来在CVPR NeurIPS等人工智能顶会上发表多篇论文 曾获
  • 多逆变器三相并网下垂控制仿真模型(Simulink仿真实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink仿真实现
  • 钛合金的检测项目和标准-科学指南针

    根据国际商业市场的分析与预测 到2023年 钛合金的前景将会非常光明 可能会呈现指数增长 增长幅度较大 其实早在2017年 MRFR就指出2017 2023年这一时期内 钛合金的市场一定是保持稳定的增长 4月份 国际商业市场预测发布了 全球
  • 深度学习--环境搭建

    1 选择合适的操作系统 选择一个适合你的需求和喜好的 Linux 操作系统 比如 Ubuntu CentOS 等 此处以Ubuntu为例 2 安装anaconda创建虚拟环境 下载Anaconda安装程序 此处使用清华镜像源 wget c
  • 波奇学C++:C++11的可变参数模板和emplace

    可变参数模板 args是参数包 template