函数模板的通用性并不是万能的,我们自己人为定义的新的数据类型,模板不一定总能进行正确的识别与操作。
为了解决这个问题,我们可以利用具体化的模板,解决自定义类型的通用化。
#include<iostream>
using namespace std;template <class T>
void Compare(T &a, T &b)
{if(a == b){cout << "a == b" << endl;}else if(a > b){cout << "a > b" << endl;}else{cout << "a < b" << endl;}
}void test()
{int a = 10;int b = 20;Compare(a, b);}int main()
{test();return 0;
}
在上面我们创建了一个函数模板,用于比较 a和b的大小,在这里由于他们都是整型,函数模板能识别并比较a和b的大小
但是如果我们传入的是我们自定义的数据类型,比如下面:
#include<iostream>
#include<string>
using namespace std;class Person
{public:Person(string name, int age){Myname = name;Myage = age;}string Myname;int Myage;
};template <class T>
void Compare(T &a, T &b)
{if(a == b){cout << "a == b" << endl;}else if(a > b){cout << "a > b" << endl;}else{cout << "a < b" << endl;}
}void test()
{Person p1("Tom", 10);Person p2("Jack", 20);Compare(p1, p2);}int main()
{test();return 0;
}
在上面的代码中,我们自定义了person类,并且通过这个person类创建了两个具体的对象p1和p2,现在我想要比较这两个人的年龄,我们继续使用上面的创建的模板,能否实现成功的比较呢?
答案是不行,编译器报错了,编译器不知道要怎么比较两个Person类的实例化对象,因此在这里,我们需要使用函数模板重载的方法来实现对象的比较。
```cpp
#include<iostream>
#include<string>
using namespace std;class Person
{
public:Person(string name, int age){Myname = name;Myage = age;}string Myname;int Myage;
};// 泛型模板函数,用于比较任意类型的对象
template <class T>
void Compare(T &a, T &b)
{if(a == b){cout << "a == b" << endl;}else if(a > b){cout << "a > b" << endl;}else{cout << "a < b" << endl;}
}// 特化模板函数,用于比较类型为 Person 的对象
template <> void Compare(Person &p1, Person &p2)
{if(p1.Myage == p2.Myage){cout << "p1 == p2" << endl;}else if(p1.Myage > p2.Myage){cout << "p1 > p2" << endl;}else{cout << "p1 < p2" << endl;}
}void test()
{Person p1("Tom", 10);Person p2("Jack", 20); Compare(p1, p2);
}int main()
{test();return 0;
}
```
运行结果
p1 < p2
在这里,通过使用template <>
关键字,特化了对类型为Person
的参数进行比较的Compare
函数,针对这个特定的类型提供了特殊的实现逻辑 ,成功实现两个Person对象的年龄比较