C++11新特性数量不定的模板参数

什么叫数量不定的模板参数呢?请看下面的例子

#include <iostream>
using namespace std;

void print()//递归的出口
{
   //空实现
}

template<typename T, typename... Types>
void print(const T& firstArg, const Types&... args)
{
	cout << firstArg << endl;
	print(args...); //递归
}

int main()
{

	print(7.5, 'A', "Hello", 100);

	return 0;
}

程序运行的结果为:
在这里插入图片描述
这符合你的想法吗?

这里的…是关键字

…就是一个所谓的包
用于模板参数,就是模板参数包,如下

template<typename T, typename... Types> //这里...在Types前是语法规定的

用于函数参数类型,就是函数参数类型包,如下

void print(const T& firstArg, const Types&... args)//这里...在Types后是语法规定的

用于函数参数,就是函数参数包,如下

print(args...); 

对于print函数的解释

print(7.5, 'A', "Hello", 100);

把参数分成两部分,第一个参数7.5,和一个包(‘A’, “hello”, 100)。
然后在print函数里面再递归调用自己,第一参数是’A’,和一个包(“hello”,100)。
到后面一个参数,和一个包,包是没有参数的。在函数内部再调用print的时候已经没有参数了,就不递归了,调用第一个print(所以这里就是递归的出口)。

在可变参数模板中,你可以用sizeof…(args)查看参数的个数。

cout << "sizeof: "<<sizeof...(args) << endl;

那如果同时存在多个参数数量不定的模板时如下,那到底是调用哪个呢?与上面的print能否共存?哪个比较特化,哪个比较泛化?

template<typename ...Types>
void print(const Types&... args)
{
	cout << "调用我吗?" << endl;
}

在以上的printf中,调用的是前面的那个,没有报错证明共存,因为调用了前面的那个,所以它比较特化。

看看下面的两个标准库例子,加深对于数量不定的模板参数的理解和应用

例子1函数:
在这里插入图片描述
图中的箭头标明调用哪个函数,先找特化,没有就再找泛化去调用的。

例子2类:它的精髓在于

template<typename Head, typename... Tail>
class tuple<Head,Tail...>:private tuple<Tail...>

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困了就喝白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值