我有一个类型为
的数据成员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;
}
答案 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
实际想要做什么,它可能不可行。