参数包是编译期类型/值占位符,非容器亦非数组,仅可展开不可直接访问;声明为Ts...或args...,必须用...展开,支持类型包与值包共存,递归展开依赖模板重载与空包终止。

什么是参数包(parameter pack)
参数包不是容器,也不是数组,它是编译期的类型/值占位符,只能被展开(unpack),不能直接访问或遍历。你写 Ts... 或 args... 的那一刻,就声明了一个参数包——它本身不占运行时内存,也不支持 size()、operator[] 这类操作。
常见错误现象:error: parameter pack 'Ts' was not expanded with '...',说明你声明了包但忘了展开;或者试图对包做 sizeof(Ts)(没加 ...),编译直接失败。
- 参数包必须在声明处用
...标记,展开时也必须带...(位置决定展开方式) - 类型包(如
typename... Ts)和值包(如Ts&&... args)可共存,但不能混用同一组... - 包展开是“全展开”或“不展开”,没有部分展开语法(比如取前两个)
如何递归展开参数包(最常用模式)
靠函数模板重载 + 递归调用是最稳妥、最易理解的方式,尤其适合需要逐个处理参数的场景(比如日志打印、构造嵌套对象)。
核心逻辑:一个重载处理“至少一个参数”的情况,另一个处理“空包”作为递归终点。
template void print() {...}
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











