8.Alias Template(模板别名)

  下图中通过使用using Vec = std::vector<T,MyAlloc<T>>进行模板别名的定义,从而可以直接使用Vec<int> coll来代替上一句话,这种方法类似于C++中的typedef,但这种C++11的新机制不仅仅是为了通过设置模板别名来少写几个字,且其也无法通过typedef或#define代替,如图中下方所示。

8.Alias Template(模板别名)

为了实现下图中红框中的形式的函数调用接口,图中两种做法都会编译报错。

8.Alias Template(模板别名)

为此只能通过如下图中黄色框内文字所述,通过容器迭代器的traits(类型萃取机制)可以得到类型,这样可以实现,但是其接口的形式只能是test_moveable(list<MyString>())这样写,不是我们想要的接口形式。

8.Alias Template(模板别名)

为此,又考虑到template template parameter(模板模板参数)这种高级模板版用法,但是,这样子写,在调用这个类得构造函数时(XCls<MyString,vector> c1),编译出错,原因是红圈中所示,vector的模板参数其实有两个,第一个是类型,第二个是Allocator,虽然平时使用vector时,Allocator有默认值,因为编译器会自动进行模板参数推导,但是当使用模板模板参数时,并且第二个模板参数是以第一个为参数时,编译器就不能自动推导,为此,该方法还是实现不了。

8.Alias Template(模板别名)

最终,只有使用Alias Template来实现,红圈中所示为我们想要的接口。

8.Alias Template(模板别名)