出格网站建设公司,中国公司排行榜前十名,网站wap怎么做,域名代备案模板的特化 1.概念2.函数模板特化3.类模板的特化3.1 全特化3.2 偏特化3.2.1 部分特化3.2.2 参数更进一步的限制 4.总结 1.概念 在原模板类的基础上#xff0c;针对特殊类型所进行特殊化的实现方式 2.函数模板特化 步骤 1.必须要先有一个基础的函数模板 2.关键字 template后面接… 模板的特化 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;
};
// 函数模板 -- 参数匹配
templateclass 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 LessDate*(Date * left, Date * right)
{return *left *right;
} 注意一般情况下如果函数模板遇到不能处理或者处理有误的类型为了实现简单通常都是将改函数直接给出
bool Less(Date* left, Date* right)
{return *left *right;
}该种实现简单明了代码的可读性高容易书写。
3.类模板的特化
3.1 全特化 全特化是将模板参数列表中所有的参数都确定化 templateclass T1, class T2
class Data
{
public :Data() { cout DataT1, T2 endl; }
private:T1 _d1;T2 _d2;
};
//全特化
template
class Dataint, char
{
public :Data() { cout Dataint, char endl; }
private:int _d1;char _d2;
};3.2 偏特化
3.2.1 部分特化 将模板参数类表中的一部分参数特化 templateclass T1, class T2
class Data
{
public :Data() { cout DataT1, T2 endl; }
private:T1 _d1;T2 _d2;
};
//偏特化
// 将第二个参数特化为int
template class T1
class DataT1, int
{
public :Data() { cout DataT1, int endl; }
private:T1 _d1;int _d2;
};3.2.2 参数更进一步的限制 偏特化不仅仅是指特化部分参数而是针对模板参数更进一步的条件限制所设计出来的一个特化版本 templateclass T1, class T2
class Data
{
public :Data() { cout DataT1, T2 endl; }
private:T1 _d1;T2 _d2;
};//两个参数偏特化为指针类型
template typename T1, typename T2
class Data T1*, T2*
{
public :Data() { cout DataT1*, 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 DataT1, T2 endl;}
private:const T1 _d1;const T2 _d2;
};4.总结
优点
模板复用了代码节省资源增强了代码的灵活性
缺点
模板会导致代码膨胀问题也会导致编译时间变长出现模板编译错误时错误信息非常凌乱不易定位错误