C++可变参数模板中的省略号
看可变参数模板代码时常会遇到省略号的使用,这类奇特的“...”出现位置还不固定,容易引起困惑。C++最近一直不用都快废了,在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧,表示“参数包”,在参数名称的右侧,意为将参数包逐项展开。
参数包声明
一般在可变参数类模板或可变参数函数模板的定义时,会在参数名称的左边添加省略号以表示“参数包”:
template<typename... Arguments> class vtclass;vtclass< > vtinstance1;
vtclass<int> vtinstance2;
vtclass<float, bool> vtinstance3;
vtclass<long, std::vector<int>, std::string> vtinstance4;
template <typename... Arguments> returntype functionname(const Arguments&... args);
template <typename... Arguments> returntype functionname(Arguments&... args);
template <typename... Arguments> returntype functionname(Arguments&&... args);
template <typename... Arguments> returntype functionname(Arguments*... args);
当然,类模板和函数模板也可以限定一个以上参数的情形,限定多个参数以此类推不赘述:
template <typename First, typename... Rest> class classname;
template <typename First, typename... Rest> returntype functionname(const First& first, const Rest&... args);
参数包展开
一般在函数参数声明或者函数调用时,在参数名称的右边添加省略号,表示将参数包逐项展开:
// v1 is NOT a function parameter pack:
template <typename... Types> void func1(std::vector<Types...> v1);// v2 IS a function parameter pack:
template <typename... Types> void func2(std::vector<Types>... v2);vector<int> v1, v2, v3;
func1(v1, v2, v3);//compile err
func2(v1, v2, v3);//compile ok
这里注意省略号的位置,虽然我们本意都是想展开参数包Types,但实际code的意图到底是vector<Types>里面的Types参数有多个,还是有多个vector<Types>?显然应该是后者,因为不存在template<class T...> class vector这样的形式,只有标准库中的template<class T> class vector。因此前者编译错误。
函数调用也在参数名(实参)后面添加省略号以将实参展开:
template <typename First, typename... Rest> void print(const First& first, const Rest&... rest) {cout << first << ", ";print(rest...); // recursive call using pack expansion syntax
}template<class...Args>
void Emplace(Args&&... args) {Destory();Create(forward<Args>(args)...);
}
这里同样forward的省略号在整个forward<Args>(args)的右边,而不是args...意为对每项args展开使用完美转发。
sizeof...运算符
最后还有一个特殊的sizeof...() 运算符(与旧的 sizeof() 运算符无关)会在可变模板参数中使用,以在编译期获取参数个数:
template<typename... Arguments>
void tfunc(const Arguments&... args)
{constexpr auto numargs{ sizeof...(Arguments) };X xobj[numargs]; // array of some previously defined type Xhelper_func(xobj, args...);
}
C语言中的省略号
C中的省略号一般和可变参数宏一起使用,该省略号不仅可以放在函数的参数列表中,也可以放在宏定义中:
#define SUM(...) sum_impl(__VA_ARGS__, ())
省略号在宏定义中表示一个可以接收任意数量参数的变参。而 __VA_ARGS__ 是一个预处理器的宏,它表示传递给宏的省略号中的实际参数。至于可变参数宏如何使用参考我之前的这篇:https://blog.csdn.net/brahmsjiang/article/details/79366432
相关文章:
C++可变参数模板中的省略号
看可变参数模板代码时常会遇到省略号的使用,这类奇特的“...”出现位置还不固定,容易引起困惑。C最近一直不用都快废了,在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧,表示“…...
uni-ui 使用uni-icons有些图标显示不出来,如down,up图标
问题描述 我使用的是uni创建时勾选的uni-ui模板,一次偶然机会发现down图标显示不出,left,right等其他图标又可以。 最后发现使用uni-icons不是最新版本导致的,使用模板生成的icons是1.3.5版本,我在插件市场找到的是2.0…...
动态增删表格
期望目标:实现一个能通过按钮来动态增加表格栏,每次能添加一行,每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…...
Java-(乘法表之后)增强for循环
这里我们先做个了解,之后我会在数组中进行详细介绍Java5引入了一种主要用于数组或集合的增强型for循环Java增强型for循环语法格式如下 For(声明语句:表达式){ //代码语句 } 声明语句:声明新的局部变量,该变量的类型…...
Celery(分布式任务队列)入门学习笔记
Celery 的简单介绍 用 Celery 官方的介绍:它是一个分布式任务队列; 简单,灵活,可靠的处理大量消息的分布式系统; 它专注于实时处理,并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话,整个应用体系就是下…...
【网络】tcp协议如何保证可靠性
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,为网络通信提供了可靠性和连接稳定性。本文将详细介绍 TCP 协议如何保证数据的可靠传输和连接的稳定性,并分析其优缺点。 可靠性保证 序号和确认机制&…...
select,poll,epoll
在 Linux Socket 服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select,poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…...
【48天笔试强训】day18
题目1 描述 有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。 例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子,假如兔子都…...
链表经典面试题01
目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…...
基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )
【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展,市场经济的信息化,让企业之间的竞争变得࿰…...
【动态规划-最长上升子序列模型part2】:拦截导弹、导弹防御系统、最长公共上升子序列【已更新完成】
1、拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。 由于…...
Spring 如何解决 Bean 循环依赖
循环依赖解释 bean A 属性注入时依赖bean B ,并且bean B属性注入时也依赖bean A ,造成 bean A 和bean B 都无法完成初始化问题,形成了闭环。 注意 项目中存在Bean的循环依赖,是Bean对象职责划分不明确、代码质量不高的表现&#…...
【driver4】锁,错误码,休眠唤醒,中断,虚拟内存,tasklet
文章目录 1.互斥锁和自旋锁选择:自旋锁(开销少)的自旋时间和被锁住的代码执行时间成正比关系2.linux错误码:64位系统内核空间最后一页地址为0xfffffffffffff000~0xffffffffffffffff,这段地址是被保留的,如果…...
python之 函数相关知识解析
01 函数的注释与嵌套 1.函数的注释 函数的注释与普通注释的区别:用来说明当前函数的参数含义 param 参数名: 参数的注释信息 return: 函数的返回值 例如: def fun1(name):""":param name: 参数的注释信息:return: 函数的返回值"…...
监视器和显示器的区别,普通硬盘和监控硬盘的区别
监视器与显示器的区别,你真的知道吗? 中小型视频监控系统中,显示系统是最能展现效果的一个重要环节,显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中,显示系统是最能展现效果的一个重要…...
Linux:升级OpenSSL和OpenSSH
原因是现有版本存在安全漏洞,需要升级到新版本 原有版本和升级后的版本 OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSL 1.1.1w 11 Sep 2023OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023目录 查看现有版…...
方法的入栈和出栈
一.作用域问题 1.全局作用域 在全局都能进行访问的变量 var a 10;function fn() {var b 20;return a b;}console.log(fn()); 2.局部的作用域 只能在限定的范围内进行访问 function fn() {var b 20;}console.log(b); b is not defined 打印的结果是b这个变量没用定义 3…...
PHP介绍
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:PHP❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、PHP是什么? 二、 PHP 文件是什么? 三、PHP能做什么? 四、P…...
接口自动化测试之-requests模块详解
一、requests背景 Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。 二、requests安装 利用p…...
低代码+定制物资管理:创新解决方案探析
引言 在当今快速变化的商业环境中,企业面临着不断增长的挑战,如提高效率、降低成本、满足客户需求等。为了应对这些挑战,企业需要不断创新并采用先进的技术解决方案。在这样的背景下,低代码开发和定制化物资管理成为了引领企业变…...
Rainmeter社区贡献者奖励计划:实物与虚拟奖励
Rainmeter社区贡献者奖励计划:实物与虚拟奖励 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter Rainmeter作为一款强大的Windows桌面自定义工具,其蓬勃发展离不开全球…...
《QGIS快速入门与应用基础》240:指北针旋转与大小调整
作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...
体验开发新范式:如何用快马平台的AI大模型将想法直接变成代码
最近尝试用AI辅助开发工具来快速实现一个任务管理应用,整个过程让我对现代开发方式有了全新认识。和大家分享一下这个有趣的实践经历: 需求分析阶段 传统开发需要先梳理功能清单,但这次我直接把自然语言描述输入到InsCode(快马)平台的AI对话框…...
DanKoe 视频笔记:数字经济学:未来职业之路:从工作到游戏 [特殊字符]
在本节课中,我们将探讨未来职业发展的核心范式转变。我们将学习如何将个人好奇心转化为可持续的在线事业,并理解构建个人品牌与数字资产的底层逻辑。 在过去的一个月里,我意识到我生活中以及许多人生活中的一个共同主题:痴迷。 童…...
ChatGPT订阅接口开发实战:从零搭建到生产环境部署
ChatGPT订阅接口开发实战:从零搭建到生产环境部署 最近在做一个需要集成智能对话能力的项目,自然而然地想到了ChatGPT的订阅接口。本以为调用个API是分分钟的事,结果一脚踩进了坑里。403鉴权失败、消息顺序错乱、突如其来的配额限制……这些…...
浪潮服务器硬盘红灯报警?手把手教你更换RAID阵列故障盘(附同步失败解决方案)
浪潮服务器硬盘红灯报警全流程处置指南:从故障诊断到阵列重建 当浪潮服务器的硬盘指示灯突然亮起刺眼的红色,大多数运维人员的第一反应往往是心头一紧。这种视觉警报不仅意味着硬件故障,更可能预示着数据丢失的风险。不同于普通PC的硬盘故障…...
MySQL 8.0迁移后表名报错?别急着改my.cnf,先搞懂lower_case_table_names这个坑
MySQL 8.0表名大小写陷阱:从踩坑到系统化解决方案 当数据库管理员小李将公司核心业务系统从MySQL 5.7迁移到8.0版本后,系统突然开始频繁报错"表不存在",而实际上这些表明明就在数据库中。这个看似简单的表象背后,隐藏着…...
KDE vs直方图:7个真实数据集对比告诉你何时该用核密度估计
KDE vs直方图:7个真实数据集对比揭示核密度估计的最佳实践 在数据分析的日常工作中,我们常常需要快速理解数据的分布特征。直方图作为最基础的分布可视化工具,几乎成为每个数据分析师的第一选择。但当我第一次在电商用户行为分析中遇到双峰分…...
2026论文写作工具红黑榜:AI论文工具怎么选?用过才敢说!
2026年论文写作工具红黑榜出炉,千笔AI、ThouPen、豆包位列红榜,适配国内学术规范,提升写作效率;黑榜需避开低质免费工具、无真实引用平台及过度依赖全文生成的工具。选择时可按需求匹配度 - 数据可信度 - 成本承受力三维模型进行评…...
Ostrakon-VL-8B零基础上手:无需代码,5分钟完成门店图片智能分析
Ostrakon-VL-8B零基础上手:无需代码,5分钟完成门店图片智能分析 1. 引言 想象一下,你是一家连锁便利店的区域经理,手下管着几十家门店。每周巡店检查,光是看照片、数货架、查价格标签,就要花掉大半天时间…...
