C++函数模板的局限性以及解决方法(模板的特化)
template<typename T>
//等价于
template<class T>
函数模板的局限性
假设有如下函数模板:
template<class T>
void f(T a, T b)
{ … }
如果代码实现时定义了赋值操作 a = b
,但是T为数组,这种假设就不成立了,同样,如果里面的语句为判断语句 if(a>b)
,但T
如果是结构体,该假设也不成立,另外如果是传入的数组,数组名为地址,因此它比较的是地址,而这也不是我们所希望的操作。
总之,编写的模板函数很可能无法处理某些类型,另一方面,有时候通用化是有意义的,但C++语法不允许这样做。
模板的特化(此处仅展示函数模板的特化)
为了解决这种问题,可以提供模板的重载,为这些特定的类型提供具体化的模板,称为模板的特化,模板特化有时也称之为模板的具体化。
#include<iostream>
#include <string>
using namespace std;
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>
bool myCompare( T &a , T &b ){
if ( a == b){
return true;
}
return false;
}
// 通过模板特化自定义数据类型,解决上述问题
// 如果具体化能够优先匹配,那么就选择具体化
// 语法 template<> 返回值 函数名<具体类型>(参数)
template<>
bool myCompare<Person>(Person &a, Person &b){
if ( a.m_Age == b.m_Age){
return true;
}
return false;
}
void test01(){
int a = 10;
int b = 20;
int ret = myCompare(a, b);//普通模板
cout << "ret = " << ret << endl;
Person p1("Tom", 10);
Person p2("Jerry", 10);
int ret2 = myCompare(p1, p2);//特化模板
cout << "ret2 = " << ret2 << endl;
}
int main(){
test01();
return EXIT_SUCCESS;
}