网站开发的背景与环境做网站排名优化的公司
模板的特化
- 1.概念
- 2.函数模板特化
- 3.类模板的特化
- 3.1 全特化
- 3.2 偏特化
- 3.2.1 部分特化
- 3.2.2 参数更进一步的限制
- 4.总结
1.概念
在原模板类的基础上,针对特殊类型所进行特殊化的实现方式
2.函数模板特化
步骤
1.必须要先有一个基础的函数模板
2.关键字 template后面接一对空白的尖括号<>
3.函数名后跟一对<>,<>中指定需要特化的类型
4.函数形参表:必须要和模板函数的基础参数类型完全相同,如果不同 编译器可能会报一些奇怪的错误
#include <iostream>
using namespace std;
//先创建一个日期类
class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}bool operator<(const Date& d){if (_year < d._year)return true;else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){return _day < d._day;}}return false;}bool operator==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}
private:int _year;int _month;int _day;
};
// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right)
{return left < right;
}
int main()
{cout << Less(1, 2) << endl;Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less(d1, d2) << endl;//可以比较,结果正确Date* p1 = &d1;Date* p2 = &d2;cout << Less(p1, p2) << endl; //可以比较就,结果错误return 0;
}
上述示例中,p1指向的d1显然小于p2指向的d2对象,但是Less内部并没有比较p1,p2指向对象的内容,而比较的是p1,p2指针的地址,这就无法达到预期的答案。
此时需要对函数模板进行特化
// 对Less函数模板进行特化
template<>
bool Less<Date*>(Date * left, Date * right)
{return *left < *right;
}
注意:一般情况下,如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将改函数直接给出
bool Less(Date* left, Date* right)
{return *left < *right;
}
该种实现简单明了,代码的可读性高,容易书写。
3.类模板的特化
3.1 全特化
全特化:是将模板参数列表中所有的参数都确定化
template<class T1, class T2>
class Data
{
public :Data() { cout << "Data<T1, T2>" << endl; }
private:T1 _d1;T2 _d2;
};
//全特化
template<>
class Data<int, char>
{
public :Data() { cout << "Data<int, char>" << endl; }
private:int _d1;char _d2;
};
3.2 偏特化
3.2.1 部分特化
将模板参数类表中的一部分参数特化
template<class T1, class T2>
class Data
{
public :Data() { cout << "Data<T1, T2>" << endl; }
private:T1 _d1;T2 _d2;
};
//偏特化
// 将第二个参数特化为int
template <class T1>
class Data<T1, int>
{
public :Data() { cout << "Data<T1, int>" << endl; }
private:T1 _d1;int _d2;
};
3.2.2 参数更进一步的限制
偏特化不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本
template<class T1, class T2>
class Data
{
public :Data() { cout << "Data<T1, T2>" << endl; }
private:T1 _d1;T2 _d2;
};//两个参数偏特化为指针类型
template <typename T1, typename T2>
class Data <T1*, T2*>
{
public :Data() { cout << "Data<T1*, T2*>" << endl; }
private:T1 _d1;T2 _d2;
};
//两个参数偏特化为引用类型
template <typename T1, typename T2>
class Data <T1&, T2&>
{
public :Data(const T1& d1, const T2& d2): _d1(d1), _d2(d2){cout << "Data<T1&, T2&>" << endl;}
private:const T1& _d1;const T2& _d2;
};
4.总结
优点:
- 模板复用了代码,节省资源
- 增强了代码的灵活性
缺点:
- 模板会导致代码膨胀问题,也会导致编译时间变长
- 出现模板编译错误时,错误信息非常凌乱,不易定位错误