0

0

c++可变参数模板怎么用 c++ variadic templates实例【进阶】

穿越時空

穿越時空

发布时间:2025-12-24 13:28:03

|

132人浏览过

|

来源于php中文网

原创

C++可变参数模板通过参数包与递归展开/折叠表达式支持任意数量和类型的模板参数,用于实现类型安全的泛型工具;需用typename...定义类型包、Args&&...定义值包,并在合法上下文中以args...形式展开。

c++可变参数模板怎么用 c++ variadic templates实例【进阶】

C++ 可变参数模板(Variadic Templates) 的核心是支持任意数量、任意类型的模板参数,常用于实现类型安全的泛型工具,比如 std::make_tuplestd::print(C++23)、日志函数、工厂模式等。它不是简单“传参”,而是通过**参数包(parameter pack)+ 递归展开/折叠表达式**来实现逻辑。

参数包定义与基础展开

声明可变模板时用 typename...class... 定义类型参数包,用 Args&&... 定义值参数包:

  • template struct Tuple {}; —— 类型包,可为空
  • template void func(Args&&... args) { ... } —— 值包,支持完美转发

展开必须在支持“包展开”的上下文中进行,例如函数调用、初始化列表、sizeof...、折叠表达式等。直接写 args 是非法的,必须写成 args...(尾随省略号表示展开)。

递归展开处理每个参数(经典写法)

当需要逐个处理参数(如打印、构造对象),常用“头-尾”递归分解:

立即学习C++免费学习笔记(深入)”;

Magician
Magician

Figma插件,AI生成图标、图片和UX文案

下载
  • 先定义一个终止重载(0参数版本)
  • 再定义一个带至少一个参数的重载,分离出第一个参数(head)和剩余参数包(tail...
  • 在函数体内处理 head,再递归调用自身处理 tail...

示例:类型安全的多参数打印函数

#include 
template
void print(T&& t) {
    std::cout << t << '\n';
}
template
void print(T&& t, Args&&... args) {
    std::cout << t << ' ';
    print(std::forward(args)...); // 展开 tail 并递归
}
// 使用:print(1, "hello", 3.14, std::string("world"));

折叠表达式(C++17 起,更简洁)

避免手动递归,用 (expr op ...)(... op expr) 一行展开并计算。适用于逻辑可结合(如 +&&, )的场景:

  • (std::cout —— 左折叠,等价于 ((std::cout
  • return (... && (std::is_integral_v)); —— 检查所有参数是否为整型
  • auto sum = (0 + ... + args); —— 计算数值参数和(要求所有 args 支持 +

在类模板中使用参数包(如 tuple、variant 实现思路)

可变参数模板类常配合别名模板、递归继承或成员模板特化来构建异构容器:

  • std::tuple 存储参数包,其内部就是靠递归基类或联合体+索引元组实现
  • 自定义类中可将参数包作为成员: std::tuple data;
  • 构造时用 std::make_tuple(std::forward(args)...) 转发初始化
  • 访问需配合 std::get(data) 或结构化绑定(C++17)

关键点:类模板本身不“执行”逻辑,而是把参数包保存下来,留待后续编译期推导或运行时索引操作。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.09.27

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

89

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

452

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

6

2025.12.06

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

452

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

6

2025.12.06

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

0

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 2.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.8万人学习

ASP 教程
ASP 教程

共34课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号