C++ 类模板在Android Camera代码里的一个例子

本文通过分析Android系统中Camera模块的源代码,深入探讨了C++类模板和模板类的应用。详细介绍了如何在CameraBase类中使用模板实现泛型编程,并在Camera类中实例化模板,展示了模板特化和模板元编程的技术细节。

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

对上文[转]C++ 类模板和模板类的一点小补充。

以kk系统上Camera相关代码举例,位置:

frameworks/av/include/camera/CameraBase.h
frameworks/av/include/camera/Camera.h

frameworks/av/camera/CameraBase.cpp
frameworks/av/camera/Camera.cpp

在CameraBase中提供了一些模板:

// CameraBase.h
template <typename TCam, typename TCamTraits = CameraTraits<TCam> >
class CameraBase : public IBinder::DeathRecipient
{
public:
    typedef typename TCamTraits::TCamListener       TCamListener;
    typedef typename TCamTraits::TCamUser           TCamUser;
    typedef typename TCamTraits::TCamCallbacks      TCamCallbacks;
    typedef typename TCamTraits::TCamConnectService TCamConnectService;

    static sp<TCam>      connect(int cameraId,
                                 const String16& clientPackageName,
                                 int clientUid);
    ...
protected:
    typedef CameraBase<TCam>         CameraBaseT;
    ...
}

// CameraBase.cpp
template <typename TCam, typename TCamTraits>
sp<TCam> CameraBase<TCam, TCamTraits>::connect(int cameraId,
                                               const String16& clientPackageName,
                                               int clientUid)
{
    sp<TCam> c = new TCam(cameraId);
    sp<TCamCallbacks> cl = c;
    status_t status = NO_ERROR;
    const sp<ICameraService>& cs = getCameraService();

    if (cs != 0) {
        TCamConnectService fnConnectService = TCamTraits::fnConnectService;
        status = (cs.get()->*fnConnectService)(cl, cameraId, clientPackageName, clientUid,
                                             /*out*/ c->mCamera);
    }
    ...
}

Camera代码中使用了CameraBase

// Camera.h
class Camera :
    public CameraBase<Camera>,
    public BnCameraClient
{
        ...
}

struct CameraTraits<Camera>
{
    typedef CameraListener        TCamListener;
    typedef ICamera               TCamUser;
    typedef ICameraClient         TCamCallbacks;
    typedef status_t (ICameraService::*TCamConnectService)(const sp<ICameraClient>&,
                                                           int, const String16&, int,
                                                           /*out*/
                                                           sp<ICamera>&);
    static TCamConnectService     fnConnectService;
};

// Camera.cpp
CameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService =
        &ICameraService::connect;


sp<Camera> Camera::connect(int cameraId, const String16& clientPackageName,
        int clientUid)
{
    return CameraBaseT::connect(cameraId, clientPackageName, clientUid);
}

对照一下,CameraBase.h中TCamCameraTCamTraitsCamera.h定义的CameraTraits<Camera>,可得到CameraBase.h对应的结果

// CameraBase.h
class CameraBase : public IBinder::DeathRecipient
{
public:
    typedef typename CameraListener       TCamListener;
    typedef typename ICamera           TCamUser;
    typedef typename ICameraClient      TCamCallbacks;
    typedef typename CameraTraits<Camera>::TCamConnectService TCamConnectService;

    static sp<Camera>      connect(int cameraId,
                                 const String16& clientPackageName,
                                 int clientUid);
    ...
protected:
    typedef CameraBase<Camera>         CameraBaseT;
    ...
}

同理

// CameraBase.cpp
sp<TCam> CameraBase<Camera, CameraTraits<Camera>>::connect(int cameraId,
                                               const String16& clientPackageName,
                                               int clientUid)
{
    sp<Camera> c = new TCam(cameraId);
    sp<ICameraClient> cl = c;
    status_t status = NO_ERROR;
    const sp<ICameraService>& cs = getCameraService(); //返回BpCameraService

    if (cs != 0) {
        CameraTraits<Camera>::TCamConnectService fnConnectService = &ICameraService::connect;
        status = (cs.get()->*&ICameraService::connect)(cl, cameraId, clientPackageName, clientUid,
                                             /*out*/ c->mCamera); //调用BpCameraService的connect方法
    }
    ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值