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