用C++ lambdas模仿Obj-C块行为

Eph*_*era 4 c++ lambda block objective-c c++11

是否可以像使用Objective-C块一样使用C++ lambdas?

举例来说,以下Objective-C代码:

@interface MyClass : NSObject
// ...
- (void)myMethodWithBlockParam:(void(^)(void))block;
//
@end
Run Code Online (Sandbox Code Playgroud)

该消息将按如下方式发送:

[myClassInstance myMethodWithBlockParam:^{
     // Do something inside block
}];
Run Code Online (Sandbox Code Playgroud)

有没有办法在lambdas的C++中实现相同的效果?

Joe*_*rgB 6

在C++中你可以做到

struct MyClass {
  void myMethodWithBlockParam(std::function<void()> block);
};
Run Code Online (Sandbox Code Playgroud)

这将使用lambda调用

myClassInstance.myMethodWithBlockParam([]()->void {
   // Do something inside block
});
Run Code Online (Sandbox Code Playgroud)

这很容易扩展到具有参数和返回类型的函数.使用std :: function的特殊化作为函数参数类型允许传递任何可以使用指定签名调用的函数(函数,函数对象,lambdas).

Lambdas也可以是闭包,即通过引用或值(作为副本)从其定义上下文绑定变量.

  • 使用`std :: function <>`作为参数类型还有一个好处,就是让调用者也可以传递函数指针和函数对象. (3认同)