C++ 模板特化和类型萃取
本文章参考朱友鹏老师的C++课程
模板特化
- 模板特化类似于函数重载,而且都是编译链接时确定,而非运行时确定的
- 特化。specialize 就是让模板参数T在某个具体类型时,可以特殊处理。
- 特化的模板声明,前面一般是template<>
要求函数对数值类型的参数比较大小,对string类型的参数,比较字符串的长度
全特化
//函数模板
template<typename T>
bool compater(T a, T b)
{
return (a > b ? true:false);
}
//对compater函数的string类型进行特化处理
template<> //对函数模板进行特化时,需要保留泛化的关键字在函数定义前,防止编译器不认识
bool compater(string a, string b)
{
return (a.size() > b.size ? true:false);
}
int main(void)
{
//第一种 数值类型, 在未指定参数类型为特化string类型时,编译器调用泛化类型,即函数模板
int a = 1, b = 2;
cout << compater(a, b)<<endl; //输出false,调用bool compater(T a, T b)
//第二种 string类型,当指定类型为特化类型时,编译器调用特化的函数
string a = "linux", b = "ucos";
cout << compater(a, b)<<endl; //输出false ,调用bool compater(string a, string b)
}
偏特化
模板偏特化
顾名思义“偏特化”是相对于“全特化”来说的,偏特化是指对模板内泛化的部分参数,进行特化处理,这样既保留了,模板泛化的优势,又可以对特殊情况进行处理。
注意函数模板不能偏特化,因为函数模板偏特化可以使用函数重载实现,函数重载语法出现时间比模板偏特化时间要早,故不能打破原有的语法
//类模板偏特化
#include <iostream>
#include <iostream>
using namespace std;
template<typename T1,typename T2>
class base
{
public:
void compater(T1 a, T2 b)
{
cout<< "bool compater(T1 a, T2 b) " << endl;
}
};
template<typename T1> //这要将没有特化的参数T1声明
class base<T1, double>
{
public:
void compater(T1 a, double b)
{
cout<< "bool compater(T1 a, double b) " << endl;
}
};
void main()
{
int p1 = 2;
double p2 = 2.5;
base<int, double> b1; //此时T1为int double为偏特化参数
b1.compater(p1, p2); //输出打印为"bool compater(T1 a, double b) "
}
未完待续。。。。。

浙公网安备 33010602011771号