Open bosthhe1 opened 1 year ago
对于模板特化有一点像定向调用函数,或者有点像运算符重载,运算符重载后,会去调用特定的运算符重载函数,模板特化也是调用特定的类或者函数
函数模板(用处不大)
class DATE
{
public:
DATE(int year = 1970, int monsh = 1, int day = 1)
{
_year = year;
_monsh = monsh;
_day = day;
}
bool operator<(const DATE &d)const;
private:
int _year;
int _monsh;
int _day;
};
bool DATE::operator<(const DATE &d)const
{
if (_year < d._year)
{
return true;
}
if (_year == d._year&&_monsh < d._monsh)
{
return true;
}
if (_year == d._year&&_monsh == d._monsh&&_day < d._day)
{
return true;
}
return false;
}
template<class T>
bool objless(const T a, const T b)
{
return a < b;
}
template<>
bool objless<DATE*>(DATE* a,DATE* b)//函数模板特化,需要注意的是,特化的形式必须和模板参数一致,具体看下方讲解
{
return (*a) < (*b);
}
int main()
{
cout << objless(1, 2) << endl;
DATE* p1 = new DATE(1999, 11, 26);
DATE* p2 = new DATE(1998, 12, 03);
cout << objless(p1, p2) << endl;
return 0;
}
所谓一致就是特化需要和函数模板的传参方式一致,如果函数模板加了引用,那么特化就必须加引用,如果函数模板没加引用,那么特化版本也不能加
类模板的模板特化
template<class T,class TD>
class A{
public:
A(T _a,TD _b)
{
cout << "T a,TD b" << endl;
}
private:
T a;
TD b;
};
template<>
class A<int, char>//和函数模板特化差不多
{
public:
A(int _a,char _b)
{
cout << "int a,char b" << endl;
}
private:
int a;
char b;
};
int main()
{
A<int, int> a(1,2);//调用类模板
A<int, char> b(1,'c');//调用特化版
return 0;
}
对于类模板参数,在前面已经接触很多了,但是除了模板参数,还存在非类型模板参数,非类型模板参数必须是整型(int,char,short,long)