局限性:
模板的通用性并不是万能的
例如1:
template<class T>
void f(T a, Tb)
{
a = b;
}
在上述代码提供的赋值操作中,如果传入的是数组就无法实现了。
例如2:
template<class T>
void f(T a, Tb)
{
if(a > b){ ... }
}
在上述代码中,如果传入的是person这样的数据类型,也不能正常运行
因此C++为了解决这种问题,提供模板的重载,可以为这些特定类型提供具体化的模板。
示例:
#include <iostream>
using namespace std;
#include <string>
class Person
{
public:
Person(string name,int age)
{
this -> m_name = name;
this -> m_age = age;
}
string m_name;
int m_age;
};
template<class T>
void myCompare(T &a, T &b)
{
if(a == b)
{
cout << "a == b" <<endl;
}
else
{
cout << "a != b" <<endl;
}
}
//利用具体化的Person的版本实现代码,具体化优先调用
template< >void myCompare(Person &p1, Person &p2)
{
if(p1.m_name == p2.m_name && p1.m_age == p2.m_age)
{
cout << "p1 == p2" <<endl;
}
else
{
cout << "p1 != p2" <<endl;
}
}
void test1()
{
Person p1("Tom",10);
Person p2("Tom",10);
myCompare(p1,p2);
}
int main()
{
test1();
return 0;
}
//利用具体化的Person的版本实现代码,具体化优先调用