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

C++ 可变参数模板(Variadic Templates) 的核心是支持任意数量、任意类型的模板参数,常用于实现类型安全的泛型工具,比如 std::make_tuple、std::print(C++23)、日志函数、工厂模式等。它不是简单“传参”,而是通过**参数包(parameter pack)+ 递归展开/折叠表达式**来实现逻辑。
参数包定义与基础展开
声明可变模板时用 typename... 或 class... 定义类型参数包,用 Args&&... 定义值参数包:
-
template<typename... args> struct Tuple {};</typename...>—— 类型包,可为空 -
template—— 值包,支持完美转发void func(Args&&... args) { ... }
展开必须在支持“包展开”的上下文中进行,例如函数调用、初始化列表、sizeof...、折叠表达式等。直接写 args 是非法的,必须写成 args...(尾随省略号表示展开)。
递归展开处理每个参数(经典写法)
当需要逐个处理参数(如打印、构造对象),常用“头-尾”递归分解:
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~