第18 章探讨 C++新标准.可变参数模板,模板和函数参数包,展开参数包
第18 章探讨 C++新标准.可变参数模板,模板和函数参数包,展开参数包
文章目录
18.6 可变参数模板
可变参数模板(variadic template)让您能够创建这样的模板函数和模板类,即可接受可变数量的参数。这里介绍可变参数模板函数。例如,假设要编写一个函数,它可接受任意数量的参数,参数的类型只需是cout能够显示的即可,并将参数显示为用逗号分隔的列表。请看下面的代码:
int n = 14;
double x=2.71828;
std::string mr="Mr.String objects!";
show list(n,x);
show list(x*x,"!,7:mr);
这里的目标是,定义show list(),让上述代码能够通过编译并生成如下输出:
14,2.71828
7.38905,!,7,Mr.String objects!
要创建可变参数模板,需要理解几个要点:
- 模板参数包(parameterpack);
- 函数参数包;
- 展开(unpack)参数包;
- 递归。
18.6.1 模板和函数参数包
为理解参数包的工作原理,首先来看一个简单的模板函数,它显示一个只有一项的列表:
template<typename T>
void show list0(T value)
std::cout << value s,";
在上述定义中,有两个参数列表。模板参数列表只包含T,而函数参数列表只包含 value。下面的函数调用将模板参数列表中的T设置为double,将函数参数列表中的 value 设置为 2.15:
show list0(2.15);
C++11提供了一个用省略号表示的元运算符(meta-operator),让您能够声明表示模板参数包的标识符,模板参数包基本上是一个类型列表。同样,它还让您能够声明表示函数参数包的标识符,而函数参数包基本上是一个值列表。其语法如下:
// Argsis a template parameter pack
template<typename...Args>
void show list1(Args... args)// args is a function parameter pack
其中,Args是一个模板参数包,而 args是一个函数参数包。与其他参数名一样,可将这些参数包的名称指定为任何符合C++标识符规则的名称。Args和T的差别在于,T与一种类型匹配,而 Args 与任意数量(包括零)的类型匹配。请看下面的函数调用:
show listl('S',80,"sweet",4.5);
在这种情况下,参数包 Args 包含与函数调用中的参数匹配的类型:char、int、constchar *和 double.下面的代码指出 value 的类型为
T:
void show listo(T value)
同样,下面的代码指出 args的类型为Args:
voi