[英]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.