为接口写一个 template 适配类
黄国强 2010-10-21
先看一下三个类的定义。
// 一个接口
class ICallBack
{
public:
virtual ~ICallBack(void){}
// 此处是回调
virtual void CallBack(void) = 0;
};
// 内部类
class CSomeObj
{
public:
CSomeObj(void);
~CSomeObj(void);
void Func(ICallBack * p);
};
// 对外的输出类
class CExportObj
{
public:
CExportObj(void);
~CExportObj(void);
void Func(ICallBack * pT);
private:
CSomeObj m_SomeObj;
};
显然,调用Func必须传入一个从ICallBack继承的对象,但是由于很多原因,我们无法这样做,那么就可以用template 适配类来解决这个问题。
// CExportObj 为对外的输出类
class CExportObj
{
public:
CExportObj(void);
~CExportObj(void);
void Func(ICallBack * pT);
// 下面增加了一个模板方法
template<class T>
void Func(T * pT) // 在这里无需调用者必须从 ICallBack 继承
{
TCallBackAdapter<T> tmp(pT);
m_SomeObj.Func(&tmp); // 这里传入的是 template 适配类
}
private:
CSomeObj m_SomeObj;
};
下面是template 适配类的定义
// template 适配类
template <class T>
class TCallBackAdapter : public ICallBack
{
public:
TCallBackAdapter(T * pT):m_pT(pT){}
virtual void CallBack(void)
{
m_pT->CallBack();
}
private:
T * m_pT;
};