对上文[转]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中TCam
为Camera
,TCamTraits
为Camera.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方法
}
...
}