如何使用 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
做什么,它可能不可行。
我有一个类型的数据成员:
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
做什么,它可能不可行。