如何使用lambda传递函数的引用

时间:2016-07-02 18:51:34

标签: c++ lambda pass-by-reference

我有一个类型为

的数据成员
None

构造函数接受相同类型的参数。

我应该如何使用lambdas发送这样的函数?

我已经尝试了

std::function<T(T&, T&)>&

但它失败了。

例如:

的main.cpp

MyClass tmp([](Foo &a, Foo &b) { return a+b; }, ...);

MyClass.h

#include "MyClass.h"

int main()
{
    MyClass a([](int x, int y) { return x+y;});

    return 0;
}

1 个答案:

答案 0 :(得分:4)

您正在将lambda传递给std::function &。 lambda不是std::function,因此不能直接使用。但是,lambda可以转换为std::function,因此必须构建一个包含lambda的临时std::function

由于您正在使用std::function & C ++假定您想要修改该值,否则通过非const引用将它取下来是没有意义的。修改临时没有任何影响,所以这没有意义,因此C ++不允许它。

解决问题的一种方法是采用const std::function &。这样就没有修改临时的。

另一种方法是传递您在std::function中创建的实际main

另一种方法是创建一个模板,将其转发给std::function

class MyClass
{
    public:
        template <class T>
        MyClass(T &&t)
            : fun(std::forward<T>(t)){}
    private:
        std::function<int(int, int)> fun;
};

这样MyClass会占用任何内容并使用它构建fun。请注意,fun不再是参考。 std::function必须住在某处,因为它是MyClass的一部分,所以将std::function的生命周期与MyClass联系起来是有意义的。

如果您真的希望fun成为参考,您需要为它找到一个位置,并确保它一直待在MyClass a;被销毁之后。我不推荐这条路线,因为越来越难以确保寿命是正确的。

您也可以直接存储lambda,但这有点棘手,取决于您对MyClass实际想要做什么,它可能不可行。