全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++中的可变参数模板(variadic templates)怎么用_c++模板编程黑魔法【C++11】

可变参数模板是C++11核心特性,支持任意数量和类型的模板参数,依赖类型参数包(class.../typename...)和函数参数包(Args... args),通过递归展开或折叠表达式(如f(args...)、(args, ...))实现类型安全的泛型编程。

可变参数模板是 C++11 引入的核心特性之一,它让模板能接受任意数量、任意类型的参数,是实现类型安全的泛型容器、完美转发、日志函数、元编程等高级功能的基础。用得好,代码简洁又高效;用得不熟,容易陷入递归展开和参数包(parameter pack)的迷雾中。

基础写法:声明与展开参数包

可变参数模板的关键在于 参数包(template parameter pack)函数参数包(function parameter pack),以及它们的展开方式。

  • 声明模板时用 class...typename... 表示类型参数包,如 template
  • 函数参数列表中用 Args... args 表示值参数包
  • 展开必须在支持“逗号表达式上下文”的地方进行,比如函数调用、初始化列表、基类列表等
  • 最常用展开方式:f(args...) (调用时展开)、{f(args)...} (C++17 折叠表达式)、int arr[] = {g(args)...} (初始化数组)

递归展开:处理参数包的经典模式

由于不能直接对参数包做循环,传统做法是靠“头尾分离”+递归终止来逐个处理。典型结构:

  • 先写一个只接受一个参数的重载(递归终点),例如 void print(T t) { std::cout
  • 再写一个可变参数版本,取出第一个参数(first),其余递归调用自身:template void print(T first, Rest... rest) { std::cout
  • 注意:递归调用 print(rest...) 会自动推导剩余参数类型,直到只剩一个参数触发终点重载

折叠表达式(C++17):一行搞定多数聚合操作

告别繁琐递归!C++17 引入折叠表达式,语法简洁且高效:

  • 一元右折叠:(args && ...) 等价于 args1 && args2 && args3 && ...
  • 一元左折叠:(... && args) 同样效果,但结合律不同(对 &&/|| 无影响)
  • 二元折叠:(init + ... + args) 展开为 init + arg1 + arg2 + ...
  • 实用例子:安全打印所有参数 ((std::cout —— 利用逗号表达式顺序求值

完美转发与参数包转发:保持值类别不变

配合 std::forward 和万能引用(T&&),可变参数模板能真正实现“原样转发”:

  • 写法:template void wrapper(Args&&... args) { func(std::forward(args)...); }
  • 关键点:Args&& 是万能引用,std::forward(args) 恢复原始值类别(lvalue/rvalue)
  • 这是 std::make_uniquestd::thread 构造等标准库功能的底层支撑

基本上就这些。可变参数模板不是炫技工具,而是构建现代 C++ 基础设施的砖块——理解参数包、掌握展开时机、善用折叠与转发,就能把黑魔法变成日常生产力。


# c++  # print  # 递归  # 可变参数  # int  # void  # 循环  # class  # 值参数  # 泛型  # function  # 用得  # 这是  # 第一个  # 能把  # 只剩  # 关键在于  # 时用  # 最常用  # 不熟 


相关文章: 如何在IIS中新建站点并解决端口绑定冲突?  建站主机选虚拟主机还是云服务器更好?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  制作营销网站公司,淘特是干什么用的?  如何在局域网内绑定自建网站域名?  建站之星展会模版如何一键下载生成?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  网站制作免费,什么网站能看正片电影?  建站之星如何快速更换网站模板?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  建站主机选哪种环境更利于SEO优化?  网站制作模板下载什么软件,ppt模板免费下载网站?  南京网站制作费用,南京远驱官方网站?  公众号网站制作网页,微信公众号怎么制作?  香港网站服务器数量如何影响SEO优化效果?  建站主机核心功能解析:服务器选择与网站搭建流程指南  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  建站之星ASP如何实现CMS高效搭建与安全管理?  如何获取开源自助建站系统免费下载链接?  自助网站制作软件,个人如何自助建网站?  建站主机无法访问?如何排查域名与服务器问题  如何选择美橙互联多站合一建站方案?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  javascript中的try catch异常捕获机制用法分析  如何安全更换建站之星模板并保留数据?  如何破解联通资金短缺导致的基站建设难题?  简历在线制作网站免费版,如何创建个人简历?  网站制作软件有哪些,制图软件有哪些?  如何在IIS管理器中快速创建并配置网站?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  官网网站制作腾讯审核要多久,联想路由器newifi官网  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  建站之星安全性能如何?防护体系能否抵御黑客入侵?  如何高效搭建专业期货交易平台网站?  股票网站制作软件,网上股票怎么开户?  成都网站制作报价公司,成都工业用气开户费用?  三星网站视频制作教程下载,三星w23网页如何全屏?  定制建站哪家更专业可靠?推荐榜单揭晓  ,网页ppt怎么弄成自己的ppt?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何通过虚拟机搭建网站?详细步骤解析  如何制作一个表白网站视频,关于勇敢表白的小标题?  建站之星后台密码遗忘如何找回?  python的本地网站制作,如何创建本地站点?  建站之星如何保障用户数据免受黑客入侵?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  沈阳制作网站公司排名,沈阳装饰协会官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。