如何封装C ++ lambda,它可以删除它的"包含"宾语?

时间:2015-01-11 17:32:32

标签: c++ lambda

我正在向我的包含实例添加一个按钮,如下所示:

pPromptDlg->addBtn("Okay", [](int &loopState) {
    loopState = GlobalDefs::kGameRequestingBack;
}, true);//true because it handles the "back" button

我要设置一个int成员的enum成员(包含pPromptDlg->addBtn("Okay", [](int &loopState) { loopState = GlobalDefs::kGameRequestingBack; delete pPromptDlg; pPromptDlg = nullptr; }, true); 值),表明它不再需要,但这很麻烦且可能危险,所以我更喜欢尝试

if (pPromptDlg)

然后我可以检查一下enum并不管它。 我知道lambda有效地设置了一个类,就像enum类一样,但是{{1}}需要解析包含它们定义的类,所以我猜测会有删除的副作用那个班级在lambda中的实例?

这可能还是只是懒惰?感谢。

1 个答案:

答案 0 :(得分:3)

当然,您只需捕获pPromptDlg即可:

pPromptDlg->addBtn("Okay", [&pPromptDlg](int &loopState) {
//                          ^^^^^^^^^^^ by reference, so that...
    loopState = GlobalDefs::kGameRequestingBack;
    delete pPromptDlg;
    pPromptDlg = nullptr; // <-- ... this line does something meaningful*
}, true);

*有意义的是,我的意思是通过引用捕获将允许您将lambda的pPromptDlg外部设置为nullptr。但是,即使在按值捕获中,该行仍然有用,因为它将优雅地处理lambda被多次调用的情况。