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

How to pass reference to function with lambda

我有一个类型的数据成员:

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

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

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

我试过了

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

但是失败了。

例如:

main.cpp

#include "MyClass.h"

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

    return 0;
}

MyClass.h

#pragma once

#include <functional>

class MyClass
{
    public:
        MyClass(std::function<int(int, int)>&) noexcept;
    private:
        std::function<int(int, int)>& fun;
};

您正在将 lambda 传递给 std::function &。 lambda 不是 std::function 所以它不能直接工作。但是,lambda 可以转换为 std::function,因此必须构建一个临时 std::function 来保存 lambda。

由于您使用的是 std::function & C++ 假定您要修改该值,否则通过非 const 引用获取它是没有意义的。修改临时没有效果,所以这没有意义,所以C++不允许。

解决此问题的一种方法是 const std::function &。这样就不会修改临时文件。

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

另一种方法是创建一个模板,将其参数转发给 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 做什么,它可能不可行。