std :: bind一个类,一个事件系统的一般概念

时间:2013-03-18 16:40:44

标签: c++ c++11 scope lambda conceptual

我正在开发一个基于简单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函数问题而是通过改变概念?

1 个答案:

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