C++ 11 可变长模板

在前面的章节中,我们介绍过可变长参数:

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);
}

首先我们要写通过递归类可变参数的模板类,就必须具有足够的变动性.

猜你喜欢

转载自blog.csdn.net/zhangkai19890929/article/details/82559020