模板特化不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化,以实现特定类型下非通用行为。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。
特化主要分三种
(1)全特化:将模板的参数全部指定为特定类型,类和函数都支持
(2)偏特化:部分参数指定为特定的类型,模板函数不支持偏特化
(3)特化为另外一个类模板(复杂点的偏特化),其实这种也是类似于1,2形式
例如下面是类的全特化与偏特化的写法:
#includeusing namespace std; templateclass AAA { public: void show() { cout << "普通模板类" << endl; } }; template<> class AAA{ public: void show() { cout << "全特化类" << endl; } }; templateclass AAA{ public: void print() { cout << "偏特化" << endl; } }; int main() { AAAa1; a1.show(); AAAa2; a2.show(); AAAa3; a3.print(); return 0; }
运行结果:
普通模板类 全特化类 偏特化
模板类在声明对象时,如果指定了参数的类型,对象在调用函数时,就会调用特定类的方法,如果偏特化的参数和全特化的参数相同时,调用的是全特化的方法。特化时,类名得保持一致。
例如下面的代码
#includeusing namespace std; //函数主模板 templatevoid test(T1 a, T2 b) { cout << "函数主模板" << endl; } //函数的全特化 template <> void test(int a, int b) { cout << "全特化" << endl; } //函数没有偏特化,因为有了函数重载 templatevoid test(T1 a, double b) { cout << "函数模板没有偏特化" << endl; } int main() { //普通的函数模板 test(1, 2.0f); //全特化的模板 test(1, 2); //函数偏特化 test(1, 1.234); return 0; }
运行结果
函数主模板 全特化 函数主模板
函数没有偏特化,最后的test
模板的特化在STL中应用的很广泛,例如萃取技术。下面应用模板特化来写一个“数据比较”的功能, 代码如下:
#include#includeusing namespace std; //Data类模板 templateclass Data { public: static bool IsEqual(const T& t1, const T& t2) { return t1 == t2; } }; //特化为float类型 template<> class Data{ public: static bool IsEqual(const float& t1, const float& t2) { return abs(t1 - t2) < 10e-3; } }; //特化为double类型 template<> class Data{ public: static bool IsEqual(const double& t1, const double& t2) { return abs(t1 - t2) < 10e-6; } }; //特化为T* templateclass Data{ public: static bool IsEqual(const T* t1, const T* t2) { return Data::IsEqual(*t1, *t2); } }; //特化为容器类型 templateclass Data<vector> { public: static bool IsEqual(const vector& vec1, const vector& vec2) { if (vec1.size() != vec2.size()) { return false; } else { for (int i = 0; i < vec1.size(); ++i) { if (vec1[i] != vec2[i]) return false; } } return true; } }; int main() { cout << "float -->> " << Data::IsEqual(1.2, 1.3) << endl; cout << "double -->> " << Data::IsEqual(1.23456, 1.23456) << endl; int a = 12; int* pA = &a; int b = 12; int* pB = &b; cout << "int* -->> " << Data::IsEqual(pA, pB) << endl; vectorvec1 = { 1,2,3,56,7 }; vectorvec2 = { 1,2,3,56,7 }; cout << "vec -->> " << Data<vector>::IsEqual(vec1, vec2) << endl; return 0; }
运行结果:
float -->> 0 double -->> 1 int* -->> 1 vec -->> 1
一般的看到class