簡體   English   中英

將成員函數和lambdas都傳遞給std :: function

[英]Passing both member functions and lambdas to std::function

我正在嘗試創建控件/窗口事件,類似於在C#的Windows Forms / WPF中的處理方式。 每個事件類都包含一個參數類型,並將其以及指向發送對象的指針傳遞給該參數。 使用lambda函數時,這一切都很好,但當我嘗試向事件添加成員函數時,我得到了C2276 '&': illegal operation on bound member function expression的編譯錯誤C2276 '&': illegal operation on bound member function expressionC2660 'Event<MouseButtonEventArgs>::add': function does not take 1 arguments C2276 '&': illegal operation on bound member function expression C2660 'Event<MouseButtonEventArgs>::add': function does not take 1 arguments

我如何創建一個事件類,該事件類可以從任何類中獲取lambda函數和成員函數(無論該類是否為“發送者”)?

Event.h

template<class Args> struct EventListener {

    /* The function type to be called by the event. */
    typedef function<void(ControlBaseSPtr, Args&)> ArgsFunction;
    string name;
    ArgsFunction function;
};

template<class Args> class Event {

    /* The function type to be called by the event. */
    typedef function<void(ControlBaseSPtr, Args&)> ArgsFunction;
    deque<EventListener<Args>> listeners;

    Event(EventDirections direction) {
        this->direction = direction;
    }

    void add(const string& name, ArgsFunction function) {
        EventListener<Args> listener = EventListener<Args>(name, function);
        for (auto it = listeners.begin(); it != listeners.end(); it++) {
            if (it->name == name) {
                throw exception("Event::operator+= listener already exists in the event");
            }
        }
        listeners.push_back(listener);
    }

    //...
};

Control.h

class ControlBase {
    Event<MouseEventArgs> _eventMouseMovedGlobal;
    Event<MouseButtonEventArgs> _eventMouseButtonGlobal;

    ControlBase();

    void onMouseMovedGlobal(ControlBaseSPtr sender, MouseEventArgs e);
};

Control.cpp

ControlBase::ControlBase() {
    // Works
    _eventMouseButtonGlobal.add("some name", [](ControlSPtr control, MouseButtonEventArgs e){
        //...
    };

    // Doesn't work
    _eventMouseMovedGlobal.add("some name", bind(&onMouseMovedGlobal, this, placeholders::_2))
    // Doesn't work
    _eventMouseMovedGlobal.add("some name", bind(&onMouseMovedGlobal, this))
}

void ControlBase::onMouseWheelGlobal(ControlBaseSPtr sender, MouseWheelEventArgs e) {
    //...
}

好吧,由於onMouseMovedGlobal具有2個輸入參數,因此在創建活頁夾時需要使用占位符或值。 所以,代替

_eventMouseMovedGlobal.add("some name", bind(&onMouseMovedGlobal, this, placeholders::_2))

你需要

_eventMouseMovedGlobal.add("some name", bind(&ControlBase::onMouseMovedGlobal, this, placeholders::_1, placeholders::_2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM