我们并不总是能够写出对所有可能被实例化的类型都是最合适的函数模板。在某些情况下,我们可能想利用类型的某些特性,来编写一些比模板实例化的函数更高效的函数。在有些时候,一般性的模板定义对于某种类型来说并不适用,这时我们必须为函数模板实例化提供特化的定义。
在模板显式特化定义(explicit specialization definition)中,先是关键字template和一对尖括号<>,然后是函数模板特化的定义。该定义指出了模板名、被用来特化模板的模板实参,以及函数参数表和函数体。如:
// max.h
template <class Type>
Type Max(Type t1,Type t2)
{
return (t1>t2 ? t1 : t2);
}
// const char*显式特化:覆盖了来自通用模板定义的实例
typedef const char *PCC;
template<> PCC Max< PCC >( PCC s1, PCC s2 )
{
return (strcmp(s1,s2)>0 ? s1 :s2);
}
// user.c
int main()
{
// 调用实例:int Max< int >( int, int );
int i = Max( 10, 5 );
// 调用显式特化:const char* Max< const char* >( const char*, const char* );
const char *p = Max( "hello", "world" );
cout<<"i: "<<i<<" "<<"p: "<<p<<endl;
return 0;
}