在前面的章节中,我们介绍过可变长参数:
https://blog.csdn.net/zhangkai19890929/article/details/82392300
可变长参数有很大的局限性,我们无法知道可变长参数的类型,所以我们需要想办法解决这个问题.
有没有办法能同时把类型和变量同时传递给函数呢?
模板类能够做到,但是模板类也有它的局限性,c++98 规定,模板参数的数量必须是固定的,不能是变长的.
这个规定在c++ 11中被打破了.
在C++ 11中,如果模板参数是可变长的,那么我们可以如下定义:
template <typename... Elements> class yourclass;
不要问为什么,语法规定就是如此.
Elements 被称为模版参数包(template parameter pack),可以理解为多个模版参数类型的集合,只要我们能把这个集合拆开,拆开为单个单个的元素,那么就可以正常使用了.
好,那么现在的问题就变为了如何展开这个模板参数包 ?
首先我们要明白一个道理,可变模板参数是有它的局限性的,就是我们的可变模板参数包,我们是没有直接获取包中每一个元素的类型。
所以我们要想明白,运用可变长模板参数的运用场景,可变长模板参数的偏特化和全特化都是不支持的.
展开可变长模板参数的方式有2种:
1**.通过递归展开,这个是由编译器支持的.**
(类模板和模板类的概念大家需要弄明白,类模板是很多模板类的集合,但是它是抽象的,我们在运行区间必须用的是什么?我们必须用的是已经明确确认的类型,也就是模板类,所以编译期间就必须将类模板实例化来生成模板类)
大家想想我们以前的递归函数.
不断的调用自己,碰到终止条件就退出.
void showmsg(int i)
{
if(i < 0)
return ;
showmsg(i-1);
}
首先我们要写通过递归类可变参数的模板类,就必须具有足够的变动性.