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

C16可变参数模板函数和普通函数模板

可变参函数模板和普通函数模板都是C++模板机制的一部分,单核心区别在于参数数量的灵活性,可变参函数模板支持任意数量的参数,普通函数仅支持固定数量的参数。

可变参函数模板

定义:参数数量不固定(0 个或多个),通过 “参数包”(parameter pack)表示可变的类型和值。

语法:用  type  name... Args (或  clas  s... Args )声明类型参数(表示一组可变的类型);

用  Args  ... args  声明值参数包(表示一组可变的参数,类型对应  Args );

需通过参数包展(如  args  ... )使用可变参数。

// 可变参数模板函数:接受任意数量的参数template <typename... Args>void print(Args... args) {// 折叠表达式(C++17)展开参数包并打印(cout << ... << args) << endl;}调用时可传递任意数量的参数(如 print(1)、print(2, "hello", 3.14))。

普通函数模板

定义:参数数量固定,每个参数的类型可以是模板参数(类型可变,但数量不变)。

语法:模板参数列表中仅包含固定数量的类型参数,函数参数列表的数量与类型参数对应。

示例:

// 普通模板函数:接受 2 个参数(类型可变,数量固定)template <typename T1, typename T2>void print(T1 a, T2 b) {cout << a << " " << b << endl;}

调用时必须传递 2 个参(如  prin  t(1, "hello") ),参数数量不能多也不能少。

对比核心差异解析

维度

普通函数模板(固定参数)

可变参数模板函数(任意参数)

参数数量

固定(编译期确定,如 1 个、2 个)

可变(0 个或多个,编译期根据调用自动适配)

参数包

无(无需处理参数包展开)

必须使用类型参数包( Args  ... )和值参数包( args  ... )

参数展开

无需展开(参数数量固定,直接使用)

必须展开参数包(通过递归、折叠表达式等方式)

适用场景

已知参数数量,仅需类型灵活(如通用的两数相加)

参数数量不确定的场景(如日志打印、通用转发函数)

实现复杂

简单(直接使用参数)

较高(需处理参数包展开,尤其是 C++17 前需递归)

1.参数数量的灵活性

普通模板函数:参数数量在定义时固定,调用时必须严格匹配数量。例如, temp  late <typename T> void f(T a)  只能接受 1 个参数,传递 2 个参数会编译报错。

可变参数模板函数:参数数量无限制,同一函数可接受 0 个、1 个、2 个…… 任意数量的参数,极大提升了函数的通用性。

2. 参数包的处理

普通模板函数:参数直接按名称使用(如  a 、 b ),无需额外逻辑。

可变参数模板函数:必须通过参数包展才能访问单个参数。

例如:

C++17 及以上可用折叠表达(如  (cou  t << ... << args) )简洁展开;

template <class F,class ...Args>void funa(F&&b,Args&&...args){cout<<b<<endl;(cout<<...<<(args))<<endl;}int main(){funa(2,2,3,"heelo",1.243);return 0;}

C++11/14 需用递归方式展开(定义递归函数和终止条件)。

template<class T>void a(T&& s){cout<<s<<endl;}template <class F,class ...Args>void func(F&&b,Args&&...args){cout<<b<<endl;(a(args),...);}

3.应用场景的差异

  • 普通模板函数:适合参数数量明确的场景,例如:
  • 通用的  swap  函数(固定 2 个参数);
  • 两数相加的  add  函数(固定 2 个参数)。
  • 可变参数模板函数:适合参数数量动态变化的场景,例如:
  • 日志打印函数( log(  "info", "user", id, "login") );
  • 通用工厂函数( make  _object<T>(args...)  转发任意构造参数);
  • 标准库中的  std:  :make_shared 、 std:  :thread  构造函数等。

3.总结

  • 普通函数模板是 “类型灵活但数量固定” 的模板,适合参数数量已知的场景,实现简单。
  • 可变参数模板函数是 “类型和数量都灵活” 的模板,通过参数包支持任意数量的参数,适合通用性要求极高的场景,但实现复杂度更高(需处理参数包展开)。
http://www.dtcms.com/a/532093.html

相关文章:

  • 网站建设规划设计方案建设部门电工证查询网站
  • ​​lseek​​的“时空跳跃”:从获取大小到制造“文件空洞”
  • 技术演进中的开发沉思-151 java-servlet:会话管理
  • 【IO多路转接】IO 多路复用之 select:从接口解析到服务器实战
  • 淄博周村学校网站建设定制wordpress文章和页面
  • Multitouch for mac 触控板多点手势创建
  • SIGCHLD:进程终止与僵尸进程清理的关键
  • 数据结构(10)
  • 南皮做网站的团队管理的七个要点
  • Mysql的数据备份和高可用
  • 【Kotlin】数组集合常用扩展函数
  • css新增盒子属性——尺寸调节
  • 做阿里国际网站会有成效吗上海网站建设公司招人
  • 【课堂笔记】概率论-3
  • 【硬件基础篇】:CPU如何被制造出来
  • 面向模块的综合技术之控制集优化(七)
  • 做网站广告软件网站系统设计目标
  • 使用稀疏采样方法减轻汽车雷达干扰——论文阅读
  • 阮一峰《TypeScript 教程》学习笔记——d.ts 类型声明文件
  • Spring AOP:横切关注点的优雅解决方案
  • 如何申请网站空间和注册域名鞋子软文推广300字
  • 基于AutoDL远端服务器在pycharm复现:具身智能论文pai0
  • 如何看访问网站的dns网站开发难不难
  • 数据结构·堆
  • 阮一峰《TypeScript 教程》学习笔记——类型映射
  • 需要做网站建设和推广网站地图插件
  • PyCharm 设置 Tabs and Indents
  • Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
  • 【SpringBoot】详解Maven的操作与配置
  • 【C++】STL容器--priority_queue的使用与模拟实现