DiuR21Laonnu

可变参数模版

2017/09/26

前言

​ 初接触类模版与函数模版时,虽然感觉这是C++与C对比非常不一样的一个特性。可是也就仅此,固定数量的模版参数,并未让我感觉到这是一项多么酷炫的特性。

​ 而在C++11中,C++引入了一项新特性。这项特性允许开发者表示0到任意个数、类型的参数。

参考:

wiki

基本语法

1
2
3
4
5
6
7
8
template<typename T> void fucc(T t); //c++03/98 bef
template<typename... Arguments> void fuc(Arguments... args); //c++11 lat
int main()
{
fucc(1);
fuc(1,2,3,4,5);
}

在模版参数的左侧出现省略号…,声明一个参数包(parameter pack)。

而省略号出现在包含参数包的表达式的右侧,则把这个参数包解开为一组实参,使得在省略号前的整个表达式使用每个被解开的实参完成求值,所有表达式求值结果被逗号分开。

参数包处理

初见参数包展开,想必可能会心存幻想。认为参数包传递后,对于参数的使用是十足所见即所得的。然而事实是,参数包的处理需要各种奇淫巧技。

主要的方法有:

​ 递归使用

​ 哑扩展标记

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void tfuc()
{
cout << "tfuc end" << endl;
}
template<typename T,typename... Args>
void tfuc(T t,Args... args)
{
cout << t << endl;
tfuc( args... );
}
template<typename T>
T prin(T t)
{
cout << t << endl;
return t;
}
template<typename... Args>
void pass(Args... args){}
template<typename... Args>
void tfuc2(Args... args)
{
pass( prin(args)... );
}
int main()
{
tfuc(1,"hello");
tfuc2(2,"world");
}