我正在开发一个基于简单event-system。
的库对于使用GUI元素(“控件”)的工作,需要这些元素。例如,Window
类有一堆事件,比如“onMouseMove”,“onKeyPress”,“onKeyRelease”,..但是,控件的基本类是Control
类。它有一个虚拟函数绘制(显然可以绘制控件)和一个连接控件和主窗口事件的虚函数连接(类似于Qt信号槽概念)。
但是由于Event
类将std::function<...>
指针作为主题(=&gt; 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<...>
将该函数分配给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函数问题而是通过改变概念?
答案 0 :(得分:2)
我不确定你的要求,因为我找不到问题,但是......
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.
这会创建一个具有一个未绑定参数的可调用对象,即它期望使用一个参数调用,该参数与std::function<void()>
不兼容,因为这是一个期望在没有参数的情况下调用的函数。它也与您显示的eventHandler
成员函数不兼容,因为它也不带参数。
也许您只想使用std::bind(&A::eventHandler, this);