我正在尝试创建一个通用的“回调”对象,它将保存任意数据并调用相关类的成员函数。由于内部政策,我不能使用 Boost。
回调对象如下所示:
template<typename Object, typename Data>
class Callback
{
public:
typedef void (Object::*PHandler)(Callback*);
Callback(Object* obj, PHandler handler) : pObj(obj), pHandler(handler) {}
Callback& set(PHandler handler) { pHandler = handler; return *this; }
void run() { (pObj->*pHandler)(this); }
public:
Data data;
protected:
Object* pObj;
PHandler pHandler;
};
它适用的课程:
struct Object1
{
struct Data { int i; };
typedef Callback<Object1, Data> Callback1;
void callback(Callback1* pDisp) { printf("%cb\n", pDisp->data.i); }
void test()
{
Callback1 cb(this, &Object1::callback);
cb.data.i = 1;
cb.run();
}
};
以下测试按预期工作:
Object1 obj1;
obj1.test();
到现在为止还挺好。
但是,当同事尝试从Callback
类派生而不是使用 atypedef
时,由于指针不兼容,他们得到了编译错误:
struct Object2
{
struct Data { int i; Data(int j) { i = j; } };
class Callback2 : public Callback<Object2, Data>
{
Callback2(Object2* obj, PHandler handler, int i) : Callback(obj, handler) { data.i = i; }
};
void callback(Callback2* pDisp) { printf("%cb\n", pDisp->data.i); }
void test()
{
Callback2 cb(this, &Object2::callback, 2);
cb.run();
}
};
我尝试在回调类中使用“奇怪的重复模板模式”并设法让派生类工作,但它破坏了使用该typedef
方法的代码。
我的问题是:
如何修改 Callback
该类以处理这两种情况,而不需要该类用户的额外工作?