#include <iostream>
#include <cstring>
using namespace std;
class Students05{
public:
string m_name;
int m_age;
Students05(string name, int age){
this->m_name = name;
this->m_name = age;
}
};
// 两个值进行对比的函数
template<typename T>
bool myCom(T& a, T& b){
if (a == b)
{
return true;
}
else{
return false;
}
}
// 重载 == 也可以实现,不过这里采用特殊模板
// 利用具体化,实现对于自定义的类型进行对比 需要提供特殊模板
template<> bool myCom(Students05& a, Students05& b){
if(a.m_name == b.m_name && a.m_age == b.m_age){
return true;
}
else{
return false;
}
}
int main()
{
// int a = 1;
// int b = 2;
// bool res = myCom(a,b);
// if(res){
// cout << "a==b" << endl;
// }
// else{
// cout << "a!=b" << endl;
// }
Students05 stu1("张三",18);
Students05 stu2("李四",20);
bool res = myCom(stu1,stu2);
if(res){
cout << "a==b"<< endl;
}
else{
cout << "a!=b"<< endl;
}
return 0;
}
模板的局限性
假设有如下模板函数:
template<class T>
void f(T a, T b)
{ … }
如果代码实现时定义了赋值操作 a = b,但是T为数组,这种假设就不成立了
同样,如果里面的语句为判断语句 if(a>b),但T如果是结构体,该假设也不成立,另外如果是传入的数组,数组名为地址,因此它比较的是地址,而这也不是我们所希望的操作。
总之,编写的模板函数很可能无法处理某些类型,另一方面,有时候通用化是有意义的,但C++语法不允许这样做。为了解决这种问题,可以提供模板的重载,为这些特定的类型提供具体化的模板。