在 C++17 中将 lambda 作为方法参数传递的最简单方法

Mr.*_*Boy 4 c++ c++17

谷歌向我展示了很多关于将 lambdas 作为参数传递的 SO 帖子,但它们似乎都基于 C++0x/C++11(例如使用 lambda 作为 C++ 函数的参数),我知道这是一个领域在最近的 C++ 版本中有所改进?

我想传递一个非常简单的委托return MyGlobals.GetX()作为方法变量——在我的例子中MyGlobals是一个全局对象。即在伪代码中

//stores and/or calls the lambda
myObject.SetXGetter({return MyGlobals.GetX()});

MyObject::SetXGetter(lambda?)
{
 this->mLambda = Lambda;
 cout << mLambda();
}
Run Code Online (Sandbox Code Playgroud)

较旧的 C++ 版本使得必须使用 STL 包装器和临时类型变得非常混乱,所以在 C++17 及更高版本中,它可以做得多么巧妙......SetGetter看起来像什么,它可以被称为直接传递 lambda 吗?

(如果更新版本有不同的替代方案,请分享)

asc*_*ler 5

一个只想在自己执行期间调用传递的 lambda 或其他函子的函数可以是函数模板,推导出函子的类型:

template <typename F>
void use_it(F&& func) {
    do_something_with(func());
}
Run Code Online (Sandbox Code Playgroud)

在这里,您要存储稍后要调用的函子,因此我们需要一个可以包装各种函子的通用类型。这std::function就是为了。假设返回类型为int

#include <functional>

class MyObject {
// ...
private:
    std::function<int()> mLambda;
};
void MyObject::SetXGetter(std::function<int()> func) {
    mLambda = std::move(func);
}
Run Code Online (Sandbox Code Playgroud)

您的调用缺少lambda 表达式所需的初始[捕获],即使没有捕获任何内容:

myObject.SetXGetter([]{ return MyGlobals.GetX(); });
Run Code Online (Sandbox Code Playgroud)