Skip to content

可变参数模板(C++11)

一句话

允许模板接受任意数量、任意类型的参数,是类型安全地替代 C 风格可变参数(va_list)的现代方案。

头文件

无需头文件(语言特性)

核心 API 速查

操作签名说明
类型参数包typename... Ts接受零个或多个类型参数
非类型参数包Ts... args接受零个或多个非类型参数
模板模板参数包template<typename> class... Ts接受零个或多个模板
参数包展开args...将参数包展开为多个表达式
参数包大小sizeof...(args)返回参数包中的元素数量
折叠表达式(args op ...) / (... op args)C++17,对参数包执行逐元运算

最小示例

cpp
// Standard: C++11
#include <iostream>

template<typename... Ts>
void print(Ts... args) {
    // 利用初始化列表保证顺序地逐个打印
    int dummy[] = {(std::cout << args << " ", 0)...};
    (void)dummy;
}

int main() {
    print(1, "hello", 3.14);
}

嵌入式适用性:中

  • 可完全替代不安全的 va_list,提升类型安全性与代码可维护性
  • 模板实例化会导致代码膨胀(二进制体积增加),需关注 Flash 占用
  • 适合资源较充足的场景(如带 Linux 的应用处理器),裸机低端 MCU 上需谨慎评估

编译器支持

GCCClangMSVC
4.32.9待补充

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建