将成员函数和 lambda 传递给 std::function

trigger_segfault

我正在尝试创建类似于在 C# 的 Windows 窗体/WPF 中完成的控件/窗口事件。每个事件类都包含一个参数类型并传递它以及一个指向发送对象的指针。使用 lambda 函数时,这一切都很好,但是当我尝试向事件添加成员函数时,我收到了C2276 '&': illegal operation on bound member function expressionand的编译错误C2660 'Event<MouseButtonEventArgs>::add': function does not take 1 arguments

我将如何创建一个可以从任何类中获取 lambda 函数和成员函数的事件类(无论该类是否是“发送者”)?

事件.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);
    }

    //...
};

控制.h

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

    ControlBase();

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

控制文件

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) {
    //...
}
mshrbkv

好吧,由于onMouseMovedGlobal有 2 个输入参数,因此在创建活页夹时,您需要为它们都设置占位符或值。所以,而不是

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

你需要

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将成员函数指针传递给std :: function

来自分类Dev

将输入参数传递给lambda函数中的std :: function

来自分类Dev

为什么不能将lambda传递给需要std :: function的函数?

来自分类Dev

将shared_ptr传递给std :: function(成员函数)

来自分类Dev

将推断的类型传递给std :: find_if lambda函数

来自分类Dev

如何将成员函数绑定到std :: function?

来自分类Dev

如何将成员函数绑定到std :: function?

来自分类Dev

将匿名函数对象传递给std :: function?

来自分类Dev

将带有所有参数的成员函数传递给std :: function

来自分类Dev

将成员函数传递给模板函数

来自分类Dev

将lambda参数传递给没有中间变量的std :: function参数

来自分类Dev

为什么不将具有默认参数的函数传递给模板化的构造函数,并使用lambda将其存储为std :: function <void()>起作用?

来自分类Dev

std :: functions和lambda函数传递

来自分类Dev

将成员函数传递给glfwSet * Callback

来自分类Dev

将C ++ 11 std :: function传递给需要boost :: function的旧函数是否安全?

来自分类Dev

将成员函数传递给可变参数模板函数

来自分类Dev

将成员函数指针传递给C样式函数

来自分类Dev

将成员函数作为参数传递给函数模板

来自分类Dev

如何将函数指针从std :: function传递给Linux克隆?

来自分类Dev

C ++-在传递给`std :: function`时指定重载的函子或函数

来自分类Dev

将std :: bind的结果传递给std :: function“重载”

来自分类Dev

如何将此 std::function 传递给 std::async

来自分类Dev

将lambda传递给模板函数

来自分类Dev

访问传递给函数python的lambda值

来自分类Dev

传递给线程的lambda内的调用函数

来自分类Dev

将变量传递给 lambda 函数

来自分类Dev

将成员函数指针作为参数传递给模板方法

来自分类Dev

将成员函数指针传递给父类

来自分类Dev

Fortran:将成员过程传递给外部函数

Related 相关文章

  1. 1

    如何将成员函数指针传递给std :: function

  2. 2

    将输入参数传递给lambda函数中的std :: function

  3. 3

    为什么不能将lambda传递给需要std :: function的函数?

  4. 4

    将shared_ptr传递给std :: function(成员函数)

  5. 5

    将推断的类型传递给std :: find_if lambda函数

  6. 6

    如何将成员函数绑定到std :: function?

  7. 7

    如何将成员函数绑定到std :: function?

  8. 8

    将匿名函数对象传递给std :: function?

  9. 9

    将带有所有参数的成员函数传递给std :: function

  10. 10

    将成员函数传递给模板函数

  11. 11

    将lambda参数传递给没有中间变量的std :: function参数

  12. 12

    为什么不将具有默认参数的函数传递给模板化的构造函数,并使用lambda将其存储为std :: function <void()>起作用?

  13. 13

    std :: functions和lambda函数传递

  14. 14

    将成员函数传递给glfwSet * Callback

  15. 15

    将C ++ 11 std :: function传递给需要boost :: function的旧函数是否安全?

  16. 16

    将成员函数传递给可变参数模板函数

  17. 17

    将成员函数指针传递给C样式函数

  18. 18

    将成员函数作为参数传递给函数模板

  19. 19

    如何将函数指针从std :: function传递给Linux克隆?

  20. 20

    C ++-在传递给`std :: function`时指定重载的函子或函数

  21. 21

    将std :: bind的结果传递给std :: function“重载”

  22. 22

    如何将此 std::function 传递给 std::async

  23. 23

    将lambda传递给模板函数

  24. 24

    访问传递给函数python的lambda值

  25. 25

    传递给线程的lambda内的调用函数

  26. 26

    将变量传递给 lambda 函数

  27. 27

    将成员函数指针作为参数传递给模板方法

  28. 28

    将成员函数指针传递给父类

  29. 29

    Fortran:将成员过程传递给外部函数

热门标签

归档