0

我正在开发一个基于简单事件系统的库。

对于使用 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 函数问题,而是通过改变概念?

4

1 回答 1

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);

于 2013-03-18T18:42:50.330 回答