繁体   English   中英

C++ Lambda 回调 - 如何捕获变量?

[英]C++ Lambda Callback - How to capture variables?

我有这堂课

typedef void(*callback)();

class Button : public Control
{
private:
    callback onClickCallback;

public:
    void bind(callback func)
    {
        onClickCallback = func;
    }

    void onClick()
    {
        onClickCallback();
    }
};

Button 继承了 Control,它被映射为 Gui 类中的一个组件。 Gui 类有一个方法可以调用列表中每个组件的 onClick 方法。 onClick 方法回调是 lambda 表达式

Gui gui;
gui.addControl<Button>(x, y, width, height).bind([] {
  MessageBox(NULL, "OK", "OK", 0);
  //How to capture gui
  //Eg add another button on click: 
  //gui.addControl<Button>(x, y, width, height);
});

这是gui类

class Gui
{
private:
    int index;
    std::unordered_multimap<int, Control*> controls;

public:
    template <typename T, typename ...Args>
    T& addControl(Args... args)
    {

        auto control = new T{ std::forward<Args>(args)... };
        std::pair<int, Control*> pair(index, control);
        controls.insert(pair);
        index++;

        return *control;
    }

    void processMessages()
    {
        for (auto it = controls.begin(); it != controls.end(); ++it)
        {
            it->second->onClick();
        }
    }
};

我确实做到了,我不知道这是否是正确的解决方案,但它似乎有效。

更新了 Button 类。

class Button : public Control
{
private:
    std::function<void()> onClickCallback;

public:
    //Override
    void bind(std::function<void()> func)
    {
        onClickCallback = func;
    }

    //Override
    void onClick()
    {
        onClickCallback();
    }
};

它现在起作用了! 还增加了对不同事件的支持,例如 mouse_click、on_focus_gained 等...

gui.addControl<Button>(hWnd, "Button", 3, 26, 70, 23).bind("mouse_click", [&] {
    gui.getControl<Button>(0).setText("Clicked");
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM