gpt4 book ai didi

c++ - 是否有可能 "copy"其模板类派生自非模板基类的对象?

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:03 27 4
gpt4 key购买 nike

我用 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 对象,拷贝指向与原始对象相同的目标和操作?或者,是否有一种完全不同的方法到我应该解决的这个回调问题(虽然我不想改变太多)?

谢谢大家!

最佳答案

我不知道您是否应该采用更好的方法,但这似乎是克隆方法的理想用途。

您只需在您的 __Callback 模板中定义一个复制构造函数,在您的基类中定义一个纯虚拟 Clone 方法,然后在您的模板中实现该虚拟方法(利用您创建的复制构造函数)

例如:

class Callback
{
public:
...
virtual Callback* Clone()=0;
};

template <class __TargetType>
class __Callback : public Callback
{
public:
...
__Callback(const __Callback& other) :
__target(other.target_), __action(other.action_) { }

virtual Callback* Clone()
{
return new __Callback(this);
}
}

关于c++ - 是否有可能 "copy"其模板类派生自非模板基类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10560081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com