第18 章探讨 C++新标准.可变参数模板,模板和函数参数包,展开参数包

第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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值