2017-10-15 230 views
0

在Swift中,當我們需要將閉包作爲函數的參數傳遞時,如果閉包是要傳遞的最後一個參數,我們可以在調用函數的最後一個括號)之後指定閉包體這就是所謂的尾隨封閉。C++中Swift尾隨等效函數

夫特例如:

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++中,當我使用std ::排序和我通過閉合,如果我使用了夫特後閉合的等效代碼將是更具有可讀性。 我對C++標準比C++ 11更新很少,你知道C++中是否有類似的東西嗎?

+0

你可以發佈你想在'C++'中做一個真實(工作)例子嗎? – Galik

+0

不,C++有不同的lambda語法,所以會引入不一致。 – chris

回答

1

這是最簡單的C++等價物:

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

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

C++不預測像尾隨關閉。

注意,在C++中有塊(lambda) capturing is not implicit像雨燕或Objective C,你必須要說明什麼應該被捕獲:

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

還有一個野生捕撈,這將使它像雨燕或工作Objective C,但根據我的經驗,說明捕獲的內容和方式要好得多,在很多情況下,它避免了我創建不需要的參考週期,有時在Objective C中發生了什麼(隱含的self使用)。

注意,在目標C++模塊可以作爲C++的說法,所以這將工作太:

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

更先進的方法包括使用C++模板,但我不認爲你需要的。