4

Objective-Cブロックが使用されるのと同じ方法でC++ラムダを使用することは可能ですか?

たとえば、次のObjective-Cコードを考えてみましょう。

@interface MyClass : NSObject
// ...
- (void)myMethodWithBlockParam:(void(^)(void))block;
//
@end

メッセージは次のように送信されます。

[myClassInstance myMethodWithBlockParam:^{
     // Do something inside block
}];

ラムダを使用してC++で同じ効果を達成する方法はありますか?

4

1 に答える 1

6

C++では次のことができます

struct MyClass {
  void myMethodWithBlockParam(std::function<void()> block);
};

これはラムダで次のように呼び出されます

myClassInstance.myMethodWithBlockParam([]()->void {
   // Do something inside block
});

これは、パラメータと戻り値を持つ関数に簡単に拡張できます。関数パラメータータイプとしてstd::functionの特殊化を使用すると、指定されたシグネチャで呼び出すことができるすべてのもの(関数、関数オブジェクト、ラムダ)を渡すことができます。

ラムダはクロージャにすることもできます。つまり、参照または値(コピーとして)によって定義コンテキストから変数をバインドします。

于 2013-01-30T00:23:09.860 に答える