模板的泛化与特化和偏特化
模板的泛化
是指用的时候指定类型。
例如:
template <class key>
struct hash{};
也是我们最常使用的类型。
c++模板特化偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你对某一功能有更好地实现,那么就该听你的。
模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是模板如果有多个类型,那么就只限定为其中的一部分,其实特化细分为范围上的偏特化与个数上的偏特化。
例如:
template<> //全特化,由于是全特化,参数都指定了,参数列表故为空。
class Test<int ,char>{
public:
Test(int i,char j):a(i),b(j){cout<<"全特化"<<endl;}
private:
int a;
int b;
};
模板的偏(范围)特化是指个数,范围上的偏特化:
例如:
template<typename T2> //由于只指定了一部分参数,剩下的未指定的需在参数列表中,否则报错。
class Test<char,T2>{
public:
Test(char i,T2 j):a(j),b(j){cout<<"个数偏特化"<<endl;}
private:
char a;
T2 b;
};
template<typename T1,typename T2> //这是范围上的偏特化
class Test<T1*,T2*>{
public:
Test(T1* i,T2* j):a(i),b(j){cout<<"指针偏特化"<<endl;}
private:
T1* a;
T2* b;
};
template<typename T1,typename T2>//同理这也是范围上的偏特化
class Test<T1 const,T2 const>{
public:
Test(T1 i,T2 j):a(i),b(j){cout<<"const偏特化"<<endl;}
private:
T1 a;
T2 b;
};
特化的优先级比泛化的优先级高。
对于函数模板,却只有全特化,不能偏特化:
在我们Camera的Native Framework中广泛使用到模板技术,比如下面萃取特性的结构体CameraTraits
template <>
struct CameraTraits<Camera>
{
typedef CameraListener TCamListener;
typedef ::android::hardware::ICamera TCamUser;
typedef ::android::hardware::ICameraClient TCamCallbacks;
typedef ::android::binder::Status(::android::hardware::ICameraService::*TCamConnectService)
(const sp<::android::hardware::ICameraClient>&,
int, const String16&, int, int,
/*out*/
sp<::android::hardware::ICamera>*);
static TCamConnectService fnConnectService;
};
这个类为最基本的一个萃取类,用来获取相机的一些特性。可以看到这里使用了全特化来限定这个类只能接收Camera类型的类,从而可以通过它获取一些相机特性