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在函数模板和类模板中使用可变参数