Camera Native Framework C++语法基础之模板的泛化与特化和偏特化

本文探讨了C++模板的泛化与特化,包括全特化与偏特化的概念、实例和优先级。通过CameraTraits模板实例了解如何利用特化提取特定类型特性,并揭示了在实际项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板的泛化与特化和偏特化

模板的泛化

是指用的时候指定类型。

例如:

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类型的类,从而可以通过它获取一些相机特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super Jang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值