我正在开发一个基于简单事件系统的库。
对于使用 GUI 元素(“控件”),这些是非常需要的。例如,Window
该类有一堆事件,如“onMouseMove”、“onKeyPress”、“onKeyRelease”、.. 然而,控件的基本类是Control
类。它有一个虚函数draw(显然是绘制控件)和一个连接控件和主窗口事件的虚函数connect(类似于Qt Signal-Slot-Concept)。
但是由于Event
该类将std::function<...>
指针作为主题(=> Slot),因此我不能简单地将派生控件类的成员函数与窗口事件联系起来。作为一种解决方法,我正在做以下事情:
class A : public Control {
friend class Window;
public:
A(){
this->eventHandler = [this] () -> void {
if ( someCondition ) this->onSomeCondition.notify();
};
}
Event<> onSomeCondition;
protected:
std::function<void()> eventHandler;
void connect(Window *window){
window->onSomeHigherEvent.attach(&this->eventHandler);
}
void draw(...) const{
drawSome(...);
}
};
这基本上所做的是,它将一个 lambda 函数分配给std::function<...>
构造函数中的 ,并将其附加std::function<...>
到所选事件。
但是有一个主要问题:如果我实例化该类的更多对象会发生什么?如果我在类中指定了事件处理程序,则作为普通函数,如下所示:
void eventHandler() {
if ( someCondition ) this->onSomeCondition.notify();
}
并且可以将该函数分配给std::function<...>
using std::bind
,由于某种原因它不起作用,至少只要我使用以下调用:
std::bind(&A::eventHandler, this, std::placeholders::_1); // *this will not work since that's just a (reference to the?) copy to of the object.
无论如何,lambda-function-workaround 似乎时间效率较低,因为它并没有真正内置到类中。有没有更有效的方法来解决这个问题?也许不是通过特别解决 lambda 函数问题,而是通过改变概念?