类模板特化

编辑

全特化

编辑
template<typename T>
class Base
{
......
};

template<>
class Base<int> // Base类针对int类型的特化
{
......
};

int main()
{
  Base<int> b; // 在实例化的时候会选择特化版本而不是原始版本的模板类。
}

偏特化

编辑
template<typename T>
class Base
{
......
};

template<typename T> // Base类针对T的指针类型的偏特化
class Base<T*> 
{
......
};

template<typename T1, typename T2>
class Base1
{
......
};

template<typename T2> // Base类针对多个模板参数中的其中一个或多个的类型偏特化
class Base1<int, T2> 
{
......
};

默认模板参数

编辑
template<typename T = int>
class Base
{
......
};

itn main()
{
  Base a; // 没有显示指明模板类的模板参数时,会调用默认的模板参数(如果有的话)
}

模板的模板参数

编辑

模板的模板参数(template template parameter)是指一个模板的参数是模板类型。只有类模板允许其模板参数是模板类型;函数模板不允许具有这样的模板参数。

模板的模板参数,其实参应当是类模板名字或者别名模板(alias template)。当模板的模板参数做“形参实参结合”时,仅考虑把实参的基本(即未特化)类模板与模板的模板形参做匹配;不考虑实参的偏特化类模板,即使偏特化后的参数列表与模板的模板形参匹配得上。

模板的模板实参的参数的缺省值被忽略,即匹配时当作不存在缺省值。模板参数包不能匹配一个模板形参。反之,模板的形参是个参数包,则可以匹配0个或多个或参数包的实参。