如何用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 &
。A不是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
做什么,它可能不可行。
相关文章:
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 类 Referention 中C++回调函数引用非静态函数
- 使用函数引用指向节点的指针删除链表中的节点?
- 解释通过从函数引用返回数组的语法
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 使用默认构造函数引用成员变量初始化错误
- 无法调用函数引用 c++
- 使用 decltype(this) 获取函数引用
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 从内联函数引用文件静态变量
- Boost::将sigaction函数引用绑定到实例
- 一种比函数引用更有效的方法
- 奇怪的未定义函数引用,函数调用C++不存在
- 是否可以检测绑定成员函数引用的对象是否被删除或销毁
- 构造函数引用参数导致seg错误
- 是否可以使函数模板从函数引用中获取“decltype”
- 无法让 Lua 函数引用"self"
- 如何解析变量和函数引用(Linker & Compiler)?
- 从不同模块调用函数 - 引用错误
- 如何在主函数中连接到数据库,然后从其他函数引用它