类模板和函数模板的声明方式是一样的,在类定义/模板定义之前声明模板参数列表。例如:
// 类模板 template <class T1, class T2> class A{ T1 data1; T2 data2; }; // 函数模板 template <class T> T max(const T lhs, const T rhs){ return lhs > rhs ? lhs : rhs; }
通过全特化一个模板,可以对一个特定参数集合自定义当前模板,类模板和函数模板都可以全特化。 全特化的模板参数列表应当是空的,并且应当给出”模板实参”列表:
// 全特化类模板 template <> class A<int, double>{ int data1; double data2; }; // 函数模板 template <> int max(const int lhs, const int rhs){ return lhs > rhs ? lhs : rhs; }
注意类模板的全特化时在类名后给出了”模板实参”,但函数模板的函数名后没有给出”模板实参”。 这是因为编译器根据int max(const int, const int)
的函数签名可以推导出来它是T max(const T, const T)
的特化。
类似于全特化,偏特化也是为了给自定义一个参数集合的模板,但偏特化后的模板需要进一步的实例化才能形成确定的签名。 值得注意的是函数模板不允许偏特化,这一点在Effective C++: Item 25中有更详细的讨论。 偏特化也是以template
来声明的,需要给出剩余的”模板形参”和必要的”模板实参”。例如:
template <class T2> class A<int, T2>{ ... };
函数模板是不允许偏特化的,下面的声明会编译错:
template <class T1, class T2> void f(){} template <class T2> void f<int, T2>(){}
原文:https://www.cnblogs.com/clemente/p/10823729.html