当前位置: 首页 > news >正文

【C++篇】C++11:可变参数模板

  • 以我们平时的使用很好理解,函数的可变参数就是可以有任意个的参数可以被函数接收,具体的形参参数由我们提供的实参来推演。
  • 可变参数的底层非常简单,它是用一个数组将实参的类型存储起来,然后输出到函数形参中。

C++11看中了可变参数的优势,随之可变参数模板应运而生……

一、基本语法及原理

C++11的新特性可变参数模板能够让我们创建可以接受可变参数的函数模板和类模板。

  • 相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。
  • 然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以这块还是比较晦涩的。
  • 因此,本文我们学习一些基础的可变参数模板特性,这对我们日常使用足够了。

代码语言:javascript

AI代码解释

// Args是一个模板参数包,args是一个函数形参参数包 // 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。 template <class ...Args> void ShowList(Args... args) {}

注意:

  • 上面的参数args前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为“参数包”。
  • 参数包里面包含了0到

N(N≥0)

个模版参数。

  • 参数包名字的是可以任意指定的,并不是说必须叫做Args和args。

现在,我们可以传入任意数量和任意类型的参数到ShowList中了

代码语言:javascript

AI代码解释

int main() { ShowList(); ShowList(1); ShowList(1, 1.1); ShowList(1, 1.1, 'a'); ShowList(1, 1.1, 'a', string("woxiangchiyu")); return 0; }

sizeof…运算符计算参数包中参数的个数

使用方式:sizeof...(参数包)

代码语言:javascript

AI代码解释

template <class ...Args> void Print(Args&&... args) { cout << sizeof...(args) << endl; } int main() { double x = 2.2; Print(); // 包⾥有0个参数 Print(1); // 包⾥有1个参数 Print(1, string("xxxxx")); // 包⾥有2个参数 Print(1.1, string("xxxxx"), x); // 包⾥有3个参数 return 0; }

二、展开参数包的方式

我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点。

递归函数方式展开参数包

具体逻辑:

  1. 给函数模板添加一个模板参数,用于从接收到的函数包中分离出一个参数出来
  2. 递归调用自身函数,调用时只传参数包。
  3. 不断递归,每次都会分离出一个参数出来,直到参数包中没有参数


http://www.jsqmd.com/news/469914/

相关文章:

  • 2026年防雷领域优质避雷塔推荐榜:避雷针塔/酒杯型电力塔/镀锌避雷塔/防雷避雷塔/高压输电塔/三柱避雷塔/单管避雷塔/选择指南 - 优质品牌商家
  • 【C++篇】C++11:lambda表达式
  • 港科校友| 罗咏丰:以校友导师身份回馈科大
  • 2026创新型企业知识产权维权机构推荐榜:商业竞业限制调查、商业背景调查、商业诋毁调查、知识产权代理、知识产权侵权取证选择指南 - 优质品牌商家
  • 2026年优质镀锌避雷塔行业推荐榜:钢管避雷塔/镀锌监控塔架/防火监控塔架/防雷避雷塔/单管避雷塔/圆钢避雷塔/选择指南 - 优质品牌商家
  • 【C++篇】C++11:右值引用与移动语义
  • 【C++篇】哈希扩展:位图和布隆过滤器+哈希切割
  • 2026年破碎机公司口碑榜:五大热门服务商深度解析 - 2026年企业推荐榜
  • 排队节省40分钟!金仓数据库守护湘江新区百万居民就医路
  • 网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。
  • 若依微服务中配置 MySQL + DM 多数据源
  • 解决MySQL8.0报错Client does not support authentication protocol requested by server...问题
  • 2026年烟囱塔优质产品推荐榜:监控铁塔/瞭望监控塔/碳钢烟囱塔/角钢监控塔/道路监控塔/钢管监控塔/镀锌监控塔架/选择指南 - 优质品牌商家
  • 2026优秀可靠门窗品牌推荐:四川门窗品牌/性价比门窗/成都门窗/推拉窗/推拉门/系统门窗/节能门窗/铝合金门窗/选择指南 - 优质品牌商家
  • 2026年评价高的超低温试验箱厂家推荐:高精度-70℃~-180℃超低温试验箱源头厂家推荐 - 品牌宣传支持者
  • 这个 PUA Skill 火了:用阿里/字节的绩效话术逼 Claude 不敢放弃,一言不合打 3.25
  • 解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
  • 2026模块化移动售楼处优质服务商推荐榜:临时售楼处、临时样板间、创意集装箱售楼处、可定制的售楼处、可拆卸售楼处选择指南 - 优质品牌商家
  • 2026年初至今,吉林地区值得信赖的路边石供应商精选 - 2026年企业推荐榜
  • 工业运动控制可靠伦茨伺服品牌推荐指南:科尔摩根电机、科尔摩根直线电机、科尔摩根维修、科尔摩根驱动器、伦茨PLC选择指南 - 优质品牌商家
  • 第二章 Spring中的Bean
  • 聚焦3c电子精密抓取需求,精选2026年高可靠3c电子电爪品牌 - 品牌2026
  • 机器人灵巧手技术与应用场景:助力挑选专业灵巧手品牌 - 品牌2026
  • 为什么RTL总是姗姗来迟?
  • 2026年个性化定制防盗盖供应商推荐指南:试管瓶、进样瓶、避光瓶、酒瓶盖、铝塑盖、铝盖、食品级玻璃瓶、儿童安全盖选择指南 - 优质品牌商家
  • 解决JDK25,IDEA控制台中文乱码问题
  • 如何在 Golang 项目中高效运用 Protocol Buffers
  • 2026可靠直流充电桩优质产品推荐榜:电动汽车充电桩、重卡充电桩、高功率充电桩、3C国标充电桩、V2G充电桩、快充充电桩选择指南 - 优质品牌商家
  • 2026年出国劳务优质服务推荐榜正规资质权益保障:出国劳务哪里工资高、劳务输出公司出国务工、劳务输出出国务工、正规出国务工机构选择指南 - 优质品牌商家
  • 2026政企办公优质会议电子门牌推荐榜:人员去向电子牌、塑胶电子门牌、学校兑换柜、学生积分兑换柜、安全积分兑换柜选择指南 - 优质品牌商家