# 可变参数函数模板 Variable templates 允许模板接受任意数量和任意类型的参数。 1.基本用法 ```c++ template void func(Args... args); ``` 使用...操作符展开参数包 ```c++ template void print(Args... args) { (std::cout << ... << args) << std::endl; // C++17 折叠表达式 } ``` 2.基本使用 ```c++ #include //递归终止 void print() { std::cout << std::endl; } //可变参数模板 template void print(T first, Args... args) { std::cout << first << " "; print(args...); //递归调用,参数减一 } //use print(1, 2.5, "hello"); ``` 折叠表达式 ```c++ template void print_fold(Args... args) { //一元右折叠 ((std::cout << args << " "), ...); std::cout << std::endl; //sum int sum = (args + ...); // (args1 + args2 + args3 + ...) std::cout << "Sum: " << sum << std::endl; } //use print_fold(1, 2, 3, 4); //Output: 1 2 3 4 Sum: 10 ``` 计算参数数量 ```c++ template constexpr size_t count_args(Args... args) { return sizeof...(Args); // 或 sizeof...(args) } // 使用 std::cout << count_args(1, 2.5, "test") << std::endl; // 输出: 3 ``` 完美转发 ```c++ template std::unique_ptr make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } // 使用 auto ptr = make_unique>(5, 42); // 创建包含5个42的vector ``` 构造函数转发 ```c++ class Container { template void emplace_back(Args&&... args) { data_.emplace_back(std::forward(args)...); } private: std::vector data_; }; ``` 类型安全的格式化 ```c++ #include #include template std::string format(const std::string& fmt, Args... args) { std::ostringstream oss; // 简化实现 - 实际中需要解析格式字符串 size_t index = 0; auto process = [&](const auto& arg) { std::string placeholder = "{" + std::to_string(index++) + "}"; // 这里需要更复杂的格式化逻辑 oss << arg << " "; }; (process(args), ...); // C++17 折叠表达式 return oss.str(); } ```