我们很难写出所有可能被实例化的类型都合适的模板。某些情况下,通用模板定义对于某个类型可能是完全错误的,所以我们需要能够实现处理某些特殊情况,特化的概念变是如此。compare函数和Queue类是这个问题的很好例子。因为与C风格字符串一起使用时,他们都不能正确工作。
template <typename T>
int compare(const T &v1,const T &v2)
{
if(v1 < v2) return -1;
if(v2 < v1) return 1;
return 0;
}
如果用两个const char* 实参调用这个模板定义,函数将比较指针的值。也就是比较两个指针在内存中的相对位置,却并没有说明与指针所指数组的内容有关的任何事情。
为了能够将compare函数用于字符串,必须提供一个知道怎样比较C风格字符串的特殊定义。这些就被称作是特化的,它对模板的用户而言是透明的。
1. 函数模板的特化
特化形式:
- 关键字template后面接一对空的尖括号<>;
- 再接模板名和一对尖括号<>,尖括号中指定这个特化定义的模板参数:
- 函数形参表
- 函数体
template<>
int compare<const char*> (const char* const &v1,
const char* const &v2)
{
return strcmp(v1,v2);
}