![784090e3f0ef6a6a502de622eff51a05.png](https://i-blog.csdnimg.cn/blog_migrate/0640f583b9441e98ec96455ba4cf0e03.jpeg)
一、改变模板的“游戏规则”
C++ 没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。
比如说在模板函数内比较值的大小,这对一些基本数据类型有用,但是却不能用来比较结构体、类和数组等数据——我们并没有针对它们进行重载。对于指针来说,比较的是地址大小,而不是指针指向的数据,所以也没有现实意义。总之,我们必须对它们进行单独处理。
模板是一种泛型技术,它能接受的类型是宽泛的、没有限制的,并且对这些类型使用的算法都是一样的(函数体或类体一样)。但是现在我们希望改变这种“游戏规则”,让模板能够针对某种具体的类型使用不同的算法(函数体或类体不同),这在 C++ 中是可以做到的,这种技术称为模板的显式具体化(Explicit Specialization)。
模板函数如何显式实例化?看一下这个例子:
#include <iostream>
#include <string>
using namespace std;
typedef struct{
string name;
float score;
} STU;
template<typename T> const T & Max(const T &a, const T &b){
return a > b ? a : b;
}
template<> const STU & Max<STU>(const STU &a, const STU &b){
return a.score > b.score ? a : b;
}
ostream & operator << (ostream & out, const STU &stu){
out << stu.name << ' ' << stu.score;
return out;
}
int main(int argc, char const *argv[]){
int a = 10, b = 20;
cout<<Max(a, b)<<endl;
STU stu1 = {
"Sam", 90}, stu2 = {
"Amy", 100};
cout<<Max(stu1, stu2);
return 0;
}
请格外注意这一行:
template<> const STU & Max<STU>(const STU &a, const STU &b)
Max<STU>中的STU
表明了要将类型参数 T 具体化为 STU 类型,原来使用 T 的位置都应该使用 STU 替换,包括返回值类型、形参类型、局部变量的类型。Max 只有一个类型参数 T,并且已经被具体化为 STU 了&#