template<class T,class …Args>
使用可变模板参数
可变模板参数(Variadic Templates)是C++11引入的一项特性,允许模板接收任意数量的参数。它可以用来定义能够处理不同数量参数的模板类和函数。总结:
定义可变模板参数
可变模板参数通过使用省略号 ...
来定义。可以定义零个或多个类型参数,或零个或多个非类型参数。
1 2 3 4
| template<typename... Args> void function(Args... args) { }
|
遍历接收到的值
要遍历可变模板参数包,通常使用|
递归模板展开
折叠表达式(C++17 引入)
参数包展开的方式。
以下是几种方法的示例:
1. 递归展开
递归展开是一种经典的方法,通过递归地展开参数包来处理每个参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <iostream>
template<typename T> void print(T t) { std::cout << t << std::endl; }
template<typename T, typename... Args> void print(T t, Args... args) { std::cout << t << std::endl; print(args...); }
int main() { print(1, 2.5, "Hello", 'a'); return 0; }
|
2. 折叠表达式
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream>
template<typename... Args> void print(Args... args) { (std::cout << ... << args) << std::endl; }
int main() { print(1, 2.5, "Hello", 'a'); return 0; }
|
(std::cout << ... << args)
是一个折叠表达式,它对 args
中的每个元素依次进行 <<
操作。折叠表达式非常简洁,适用于 C++17 及更高版本。
3. 参数包展开
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream>
template<typename... Args> void print(Args... args) { int dummy[] = { 0, (std::cout << args << std::endl, 0)... }; (void)dummy; }
int main() { print(1, 2.5, "Hello", 'a'); return 0; }
|
使用初始化列表展开参数包, (std::cout << args << std::endl, 0)
对每个参数进行输出。dummy
数组只是一个辅助变量,用于展开参数包。