2017-10-15 5 views
0

スウィフトでは、関数のパラメータとしてクロージャを渡す必要がある場合、最後のカッコの後にクロージャ本体を指定することができます。)呼び出し関数これは後閉じと呼ばれます。C++でスウィフト後続クロージャに相当する

スウィフト例:私はスイフト後続クロージャと同等のものを使用する場合はC++で時々

func someFunctionThatTakesAClosure(closure:() -> Void) { 
    // function body goes here 
} 

// Here's how you call this function without using a trailing closure: 

someFunctionThatTakesAClosure(closure: { 
    // closure's body goes here 
}) 

// Here's how you call this function with a trailing closure instead: 

someFunctionThatTakesAClosure() { 
    // trailing closure's body goes here 
} 

、私はスタンダード::ソートを使用し、私はクロージャを渡し、コードが読みやすくなるであろう。 私はC++ 11より新しいC++標準の経験はほとんどありませんが、C++に似たものがあれば知っていますか?

void someFunctionThatTakesAClosure(std::function<void()> closure) { 
    // function body goes here 
} 

someFunctionThatTakesAClosure([] { 
    // code comes here 
}); 

C++閉鎖末尾のようなものを予測しない:

+0

実際の(実際の)例で 'C++ 'で何をしたいのですか? – Galik

+0

いいえ、C++にはラムダ構文が異なるため、矛盾が発生します。 – chris

答えて

1

これはC++同等物は、最も簡単です。

int copyVar = 0; 
int refVar = 1; 
someFunctionThatTakesAClosure([copyVar, &refVar] { 
    // code comes here 
    refVar += copyVar; 
}); 

それはスウィフトやのように動作させるだろう野生のキャプチャもあります:C++ではスウィフトやObjective Cの中のような(lambda) capturing is not implicitは、あなたがキャプチャされるべきかを必ず明記してくださいする必要がありブロックすること

注意目標Cでは、私の経験から、何がどのようにキャプチャされているかを述べる方がはるかに優れています。多くの場合、望ましくない参照サイクルを作りませんでした。客観的にC++のブロックはC++の引数として使用することができますので、これはあまりにも動作すること

注:

someFunctionThatTakesAClosure(^{ 
    // mixed C++/Objective C code comes here 
}); 

より高度なアプローチは、C++のテンプレートの使用を含むが、私はあなたがそれを必要としないと思います。