Template Template Paraments(双重模板参数)
模板参数本身也可以是一个类模板,例如实现一个Stack class。
为了使用其他类型的元素容器,使用者必须两次指定元素类型:一次是元素类型本身,另一次是容器类型:
Stack<int,std::vector> vStack; //int stack,以vector为容器
如果使用template template parameter,就可以只指明元素类型,无需在指定容器类型:
Stack<int,std::vector> vStack;
为了实现这种特性,你必须把第二个template parameter 声明为template template parameter.
Template<typename T,template<typename ELEM>class CONT = std::deque>
class stack{
Private:
CONT<T> elems;
Public:
......
};
其默认值则由std::deque 变更为std::deque。这个参数必须是class template,并以第一参数类型完成实例化:
CONT<T> elems;
实际运用时可以使用class template内的任何类型来实例化一个template template parameter。
通常情况下,可以将class关键字改为typename来声明一个template parameter;但是 CONT定义的是一个class类型,因此必须使用关键字class来声明它。
所以,以下为正确代码:
Template<t