c++模板特化与偏特化一
在读《effectiveC++》的时候有一节将swap()函数偏特化,基础薄弱的我根本不知道什么叫做模板偏特化,所以学习一下模板偏特化,记录一下。
C++的模板提供了对逻辑结构相同的数据对象通用行为的定义。这些模板运算对象的类型不是实际的数据类型,而是一种参数化的类型。C++中的模板分为类模板和函数模板。
类模板如下:
#include <iostream> using namespace std; template <class T> class TClass { public: // TClass的成员函数 private: T DateMember; };
函数模板如下:
template <class T> T Max(const T a, const T b) { return a > b ? a : b; }
模板特化
有时为了需要,针对特定的类型,需要对模板进行特化,也就是所谓的特殊处理。比如有以下的一段代码:
#include <iostream> using namespace std; template <class T> class TClass { public: bool Equal(const T& arg, const T& arg1); }; template <class T> bool TClass<T>::Equal(const T& arg, const T& arg1) { return (arg == arg1); } int main() { TClass<int> obj; cout<<obj.Equal(2, 2)<<endl; cout<<obj.Equal(2, 4)<<endl; }
类里面就包括一个Equal方法,用来比较两个参数是否相等;上面的代码运行没有任何问题;但是,你有没有想过,在实际开发中是万万不能这样写的,对于float类型或者double的参数,绝对不能直接使用“==”符号进行判断。所以,对于float或者double类型,我们需要进行特殊处理,处理如下:
#include <iostream> using namespace std; template <class T> class Compare { public: bool IsEqual(const T& arg, const T& arg1); }; // 已经不具有template的意思了,已经明确为float了 template <> class Compare<float> { public: bool IsEqual(const float& arg, const float& arg1); }; // 已经不具有template的意思了,已经明确为double了 template <> class Compare<double> { public: bool IsEqual(const double& arg, const double& arg1); }; template <class T> bool Compare<T>::IsEqual(const T& arg, const T& arg1) { cout<<"Call Compare<T>::IsEqual"<<endl; return (arg == arg1); } bool Compare<float>::IsEqual(const float& arg, const float& arg1) { cout<<"Call Compare<float>::IsEqual"<<endl; return (abs(arg - arg1) < 10e-3); } bool Compare<double>::IsEqual(const double& arg, const double& arg1) { cout<<"Call Compare<double>::IsEqual"<<endl; return (abs(arg - arg1) < 10e-6); } int main() { Compare<int> obj; Compare<float> obj1; Compare<double> obj2; cout<<obj.IsEqual(2, 2)<<endl; cout<<obj1.IsEqual(2.003, 2.002)<<endl; cout<<obj2.IsEqual(3.000002, 3.0000021)<<endl; }

浙公网安备 33010602011771号