C++11新特性从using化名模板到模板模板参数

Posted 老虎中的小白Gentle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11新特性从using化名模板到模板模板参数相关的知识,希望对你有一定的参考价值。

新特性化名模板

template <typename T>
using Vec = std::vector<T,MyAlloc<T>>;  //其中MyAlloc是自定义的迭代器。
//然后以后声明变量就这样写
Vec<int> coll;
//下面的写法等价于上一面的
std::vector<int,MyAlloc<int>> coll;

平时我们声明一个vector是这样的

vector<int> vec;//没有特意指定构造器,那是因为有默认值

那么使用#define和typedef会是怎么样的呢?
#define

#define Vec<T> template<typename T> std::vector<T, MyAlloc<T>>;

//你会这样定义变量
Vec<int> coll;
//因为#define是字符替代,所以推出下面的样子
//这多了前面的一些,并不是我们想要的
template<typename int> std::vector<int, MyAlloc<int>>;

至于typedef呢?
使用typedef也无法到达于using相同的效果,因为typedef是不接受参数的。

typedef std::vector<int,MyAlloc<int>> Vec;//我们最多写成这个样子了

注意:不能部分或专门化别名。写法是固定的必须带可变类型参数

然后看到这里你是不是以为,难道只是为了少打几个字就搞这样的一个新特性?
那当然不是啦!,请继续往下看

模板模板参数

有没有tmplate语法能够在模板接受一个template参数Container时,当Container本身又是个class template,能取出Container的template参数?

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std;

#define SIZE 1024
template<typename T, template<class> class Container>
class XCls
{
private:
    Container<T> c;
public:
    XCls()
    {
        for(auto a:SIZE)
            c.insert(c.end(),T());
        output_static_data(T());
        Container<T>c1(c);
        Container<T>c2(std::move(c));
        c1.swap(c2);
    }
};
//这部分不得在函数体内声明
template<typename T>
using Vec = vector<T,allocator<T>>;

template<typename T>
using Lst = list<T,allocator<T>>;

template<typename T>
using Que = Queue<T,allocator<T>>;

int main()
{
    XCls<MyString,Vec> c1;
    XCls<MyStrNoMove,Vec> c2;
    
    XCls<MyString,Lst> c1;
    XCls<MyStrNoMove,Lst> c2;
    
    XCls<MyString,Que> c1;
    XCls<MyStrNoMove,Que> c2;
    
}

using的三大用法

1.指明对该命名空间的使用和对名字空间成员使用声明

using namespace std;
using std::cout;

2.为类成员using声明
在这里插入图片描述
3.变量类型别名和别名模板(C++11新加的using特性)
类型别名

using func = void(*)(int,int)  //func是一个函数指针
typedef void(*func)(int,int);  //和上面一样的意思

template<typename T>
struct Contaniner
{
    using Value_type = T; //类型别名
}


模板

template<class CharT>
using mystring = std::basic_string<CharT,std::char_traits<CharT>>

字体的颜色和大小

以上是关于C++11新特性从using化名模板到模板模板参数的主要内容,如果未能解决你的问题,请参考以下文章

C++11新特性:8—— C++11支持函数模板的默认模板参数

C++11新特性:9—— C++11在函数模板和类模板中使用可变参数

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

C++11新特性:6—— C++11对模板实例化中连续右尖括号>>的改进

C++11 ——— 可变参数模板

C++11 ——— 可变参数模板