С++将lambda包装在函数内的另一个lambda中

时间:2019-06-19 22:01:45

标签: c++ c++11 lambda functional-programming

基本上,我有以下代码:

struct Receiver {
    void receive(std::function<void()> f) {
        func_ = f;
    }
    std::function<void()> func_;
};

void pusher(Receiver& r) {
    auto wrapper=[&](std::function<void()> w) {
        r.receive([&]() {
            cout << "Before" << endl;   
            w();
            cout << "After" << endl;    
        });
    };


    wrapper([&]() {
        cout << "Original" << endl; 
    });
}

int main() {
    Receiver r;
    pusher(r);
    r.func_();
    return 0;
}

有一个存储std :: function的类,我们将一个函数存储到该类中。 函数是在另一个函数的“包装”本地lambda中创建的。

代码显示“之前”并崩溃。 如果我将整个代码放在“ pusher”中,然后放入main(),那么一切正常。

我怀疑我们遇到的问题是,当调用r.receive()时,它包含对“ w”的引用,该引用在从“推送器”返回后是无效的。

但是我需要将lambda传递给接收器,该接收器是通过用另一个lambda进行“装饰”而创建的。

我通常如何适当地装饰lambda并引用一些本地lambda并将其传递到其他地方?

1 个答案:

答案 0 :(得分:5)

按引用捕获[&]使lambda在对w的引用到期后保留对其的引用。您需要复制w [=]或将其移动到lambda(C ++ 14)中:

r.receive([w=std::move(w)]() {
    cout << "Before" << endl;   
    w();
    cout << "After" << endl;    
});