C++11 可变参数模板,emplace,decltype

在这里插入图片描述

一.可变参数模板

可变参数模板是C++11新增的特性之一,让我们能够创建可以接收可变参数的函数模板和类模板

1.介绍与使用

在这里插入图片描述
在这里插入图片描述

2.获取参数包中的每个参数

1.错误示范

这里的语法并不支持arg[i]的方式来获取参数包中的每个参数
只能通过展开参数包的方式来获取,这是使用可变参数模板的一个主要特点

以下是错误示范:

template <class ...Args>
void ShowList(Args... args)
{
   
   
	cout << sizeof...(args) << endl;
	for (int i = 0; i < sizeof...(args); i++)
	{
   
   
		cout << args[i] << " ";
	}
	cout << endl;
}

在这里插入图片描述
为什么会这样呢?
在这里插入图片描述
在这里插入图片描述
那么我们就是想看,该怎么办呢?

2.利用编译时递归来查看参数包

既然你在编译期间就会对这个参数包进行解析,那么我就只能在编译期间来看了呗
既然要在编译期间就看,那么就必须借助一个你编译器在编译期间就要做的事情

此刻有位大佬想到了利用模板的实例化,用魔法来打败魔法
你不是要在编译期间就去实例化吗?那么我拆分一下,再写一个模板
把你这个参数个数为n的参数包拆分成1个参数+长度为n-1的参数包
(n=1+n-1)
每次查看那一个参数,不就行了吗?
而这种方法不就能够拆分成一个一个的子问题了吗?
因此不就能够利用递归了吗?

因此这位大佬设计出了编译时递归的方法
在这里插入图片描述

//递归出口
void _ShowList()
{
   
   
	cout << endl;
}

template <class T, class ...Args >
void _ShowList(T val, Args... args)
{
   
   
	cout << val << " ";
	_ShowList(args...);
}

template <class ...Args>
void ShowList(Args... args)
{
   
   
	_ShowList(args...);
}

int main()
{
   
   
	ShowList();
	ShowList(1);
	ShowList(1,2);
	ShowList(1,2.2,4.4,"hello world");
	return 0;
}

在这里插入图片描述
查看成功,下面我们来分析一下过程
在这里插入图片描述
但是你为什么这样定义顺序呢?
好怪啊,整个递归都是往上走的
我也想让它往下走啊,可是编译器编译时只会向上找,所以要把递归子函数和递归出口写在可变参数模板的上面
在这里插入图片描述

3.利用编译时数组的初始化

其实还有1种方法:利用编译时数组的初始化来搞事情

int a
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

program-learner

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

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

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

打赏作者

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

抵扣说明:

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

余额充值