我目前正在为我的C ++ 11 / OpenGL3.3项目开发一个GUI,而我正在为交互式GUI元素制作某种回调系统。我使用JS / jQuery,我真的很喜欢definig就地方法的系统,如onMouseOver,onClick我想要的每个网站元素。我发现代表是我获得此类功能的最佳方式。
示例代码:
class Button {
public:
// ...
// method (not needed in real-life, just to "show" it)
void MouseOver(int x, int y) { onMouseOver(this, x, y); }
// variable
std::function<void(Button*, int, int)> onMouseOver;
}
void someFunction(...) {
// ...
Button t = new Button(...);
t.onMouseOver = [](Button* this, int x, int y) -> void { some_code_here };
// ...
}
主要问题:
但是我担心我刚刚创建的特定onMouseOver函数的范围 - 该指针在程序结束前是否有效?有人可以解释一下该函数在其余应用程序生命周期中究竟会发生什么?
其他问题:
有没有更好的方法来做这样的事情?更简单/更有效?我见过很多&#34;不可能的快速&#34; - 真的那么慢吗?
答案 0 :(得分:3)
C ++ 11中lambda函数的作用域是什么?
根据标准§5.1.2/ 2&amp; 3个Lambda表达式[expr.prim.lambda] :
2
对lambda表达式的求值导致prvalue
临时(12.2)。 此临时称为闭包对象。
3
闭包类型在最小的块作用域,类作用域或命名空间中声明 包含相应lambda表达式的范围。
因此,根据上述内容,您的Lambda函数的作用域是函数someFunction()
的作用域。
但是,因为您将其分配给onMouseOver
成员变量,所以会激活其移动构造函数,因此onMouseOver
将保留Lambda的移动实例。
该指针在程序结束前是否有效?
类模板std::function
是通用多态函数包装器(即函数对象)。 std::function
的实例可以存储,复制和调用任何可调用目标(例如,函数,lambda表达式,绑定表达式或其他函数对象)。
因此,只要包含它的onMouseOver
类对象有效,Button
及其内容就会有效。