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

 可变参数模板

// args是参数包
template<class T,class ...Args>
void _ShowList(T value, Args... args)
{cout << sizeof...(args) << endl; // 2cout << 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;
};

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

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

相关文章

C 语言-数组

1. 数组 1.1 引入 需求&#xff1a;记录班级10个学员的成绩 需要定义10个变量存在的问题:变量名起名困难变量管理困难需求&#xff1a;记录班级1000个学员的成绩 1.2 概念 作用&#xff1a;容纳 数据类型相同 的多个数据的容器 。 特点&#xff1a; 长度不可变容纳 数据类型…

finebi 新手入门案例

finebi 新手入门案例 连锁超市销售数据分析 步骤&#xff1a; 准备公共数据新建分析主题处理数据在数据中分析在图形中分析数据大屏 准备公共数据 点击公共数据 点击新建文件夹 修改文件夹名称 上传数据 鼠标悬停在文件夹上&#xff0c;右侧出现 鼠标悬停在文件夹上&#x…

C#图像处理OpenCV开发指南(CVStar,04)——图片像素访问与多种局部放大效果的实现代码

​​​​​​​ 使用本文代码需要预先设置一点开发环境&#xff0c;请阅读另外一篇博文&#xff1a; C#图像处理OpenCV开发指南&#xff08;CVStar&#xff0c;03&#xff09;——基于.NET 6的图像处理桌面程序开发实践第一步https://blog.csdn.net/beijinghorn/article/deta…

CMake 教程:常用命令及其使用方法

CMake是一个跨平台、开源的构建工具&#xff0c;它可以自动生成Makefile或者Visual Studio等IDE的工程文件。它能够帮助开发者更方便地管理项目的构建过程&#xff0c;提高项目构建的效率。在本文中&#xff0c;我们将介绍CMake常用的命令以及对应的用法 add_executable add_e…

sql注入基础篇

sql注入基础 漏洞原理 对用户输入的数据没有做参数校验&#xff0c;sql语句没有做安全处理&#xff0c;导致用户可以通过参数控制sql语句从而查询一些敏感数据&#xff0c;甚至控制对方主机 漏洞利用 前置知识 ​ 1、首先不同的数据库&#xff0c;漏洞注入的方式也不同&#x…

Unity 一些常用注解

在Unity中有一些比较常用的注解&#xff1a; 1、[SerializeField]&#xff1a;将私有字段或属性显示在 Unity 编辑器中&#xff0c;使其可以在 Inspector 窗口中进行编辑。 2、[Range(min, max)]&#xff1a;限制数值字段或属性的范围&#xff0c;在 Inspector 窗口中以滑动条…

Selenium定位元素的方法css和xpath的区别!

selenium是一种自动化测试工具&#xff0c;它可以通过不同的定位方式来识别网页上的元素&#xff0c;如id、name、class、tag、link text、partial link text、css和xpath。 css和xpath是两种常用的定位方式&#xff0c;它们都可以通过元素的属性或者层级关系来定位元素&#…

【CAN通信】CanIf模块详细介绍

目录 1.内容简介 2.CanIf详细设计 2.1 CanIf功能简介 2.2 一些关键概念 2.3依赖的上下层模块 2.4 功能详细设计 2.4.1 Hardware object handles 2.4.2 Static L-PDUs 2.4.3 Dynamic L-PDUs 2.4.4 Dynamic Transmit L-PDUs 2.4.5 Dynamic receive L-PDUs 2.4.6Physi…

第16关 革新云计算:如何利用弹性容器与托管K8S实现极速服务POD扩缩容

------> 课程视频同步分享在今日头条和B站 天下武功&#xff0c;唯快不破&#xff01; 大家好&#xff0c;我是博哥爱运维。这节课给大家讲下云平台的弹性容器实例怎么结合其托管K8S&#xff0c;使用混合服务架构&#xff0c;带来极致扩缩容快感。 下面是全球主流云平台弹…

Hiera实战:使用Hiera实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 现代层次视觉变换器在追求监督分类表现时增加了几个特定于视觉的组件。 这些组件虽然带来了有效的准确性和吸引人的FLOP计数&#xff0c;但增加的复杂性实际上使这些变换器比普通V…

MySQL表的查询、更新、删除

查询 全列查询 指定列查询 查询字段并添加自定义表达式 自定义表达式重命名 查询指定列并去重 select distinct 列名 from 表名 where条件 查询列数据为null的 null与 (空串)是不同的&#xff01; 附&#xff1a;一般null不参与查询。 查询列数据不为null的 查询某列数据指定…

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测 目录 时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 使用先进的机器学习技术和优化算法…