可变模板参数

template<class T,class …Args>

使用可变模板参数

可变模板参数(Variadic Templates)是C++11引入的一项特性,允许模板接收任意数量的参数。它可以用来定义能够处理不同数量参数的模板类和函数。总结:

  • 参数包可以作为调用函数的参数。

定义可变模板参数

可变模板参数通过使用省略号 ... 来定义。可以定义零个或多个类型参数,或零个或多个非类型参数

1
2
3
4
template<typename... Args>
void function(Args... 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 数组只是一个辅助变量,用于展开参数包。


可变模板参数
https://weihehe.top/2024/08/07/可变模板参数/
作者
weihehe
发布于
2024年8月7日
许可协议