我用 C++ 构建了一个小型、范围有限的跨平台 UI 库。它使用以下类来处理 UI 回调:
// Base class for templated __Callback class to allow for passing __Callback
// objects as parameters, storing in containers, etc. (as Callback*)
class Callback
{
public:
virtual void execute() = 0;
virtual ~Callback() { }
protected:
Callback() { }
};
正如评论所描述的,这是回调的基类 - 它允许将它们作为参数传递并将它们存储在 UI 小部件中,以便可以执行正确的回调(例如,当用户单击按钮时)。
// C++ has no callbacks (in the sense of an action [method] of a
// target [object]), so we had to roll our own. This class can be used
// directly, but the NEW_CALLBACK macro is easier.
template <class __TargetType>
class __Callback : public Callback
{
public:
typedef __TargetType TargetType;
typedef void (TargetType::*ActionType)(void);
virtual void execute()
{
(this->__target->*this->__action)();
}
__Callback(TargetType* target_, ActionType action_) :
Callback(), __target(target_), __action(action_) { }
virtual ~__Callback() { }
private:
// target object for the callback
TargetType* __target;
// action (method) of the target that will be called
ActionType __action;
};
这个模板类是回调范式的核心。它存储指向对象的指针和指向成员函数的指针,以便以后可以在目标对象上调用成员函数。
#define NEW_CALLBACK(class_, obj_, act_) \
new __Callback<class_>(obj_, &class_::act_)
这个宏只是让创建模板__Callback
对象变得更容易一些。
这已经工作了很长时间了!带有回调的按钮可能被实例化为:
MyClass* obj = new MyClass();
Button* btn = new Button("Title", NEW_CALLBACK(MyClass, obj, btnClicked));
这将创建一个按钮,稍后将其放置在窗口或其他容器中,并在单击时调用obj->btnClicked()
.
现在,我的问题(对不起,设置冗长,我认为我不能再削减它了)。出现了我需要复制Callback*
对象的情况。当然,由于它只是一个指向基类的指针,我无法确定模板化派生类的类型。
如何复制一个任意Callback
对象,副本指向与原始对象相同的目标和动作?或者,对于这个回调问题,我应该采取完全不同的方法吗(尽管我不想改变太多)?
谢谢大家!