簡體   English   中英

C ++ 0x lambdas和operator(),閉包和仿函數之間的區別

[英]Difference between C++0x lambdas and operator(), closure and functor

我有信心獲得構造的一般要點,但我無法在c ++中看到它們的目的。 我已經在SO和其他地方閱讀了有關該主題的先前帖子,但我不明白為什么它們應該成為新的語言功能。

我想回答的問題就是這樣

  • lambda和接受函數/函子的模板參數之間有什么區別。

  • 閉包只是一個具有一些設置對象狀態(范圍?)的仿函數?

  • 這些結構的“殺手級應用”是什么? 或者也許是典型的用例?

Lambdas實際上只是一個仿函數的語法糖。 你可以自己完成:定義一個新類,使成員變量保存捕獲的值和引用,在構造函數中掛起它們,編寫operator()() ,最后創建一個實例並傳遞它。 或者你可以使用一個代碼為1/10的lambda並且工作方式相同。

不捕獲的Lambda可以轉換為函數指針。 所有lambda都可以轉換為std::function ,或者獲得它們自己的唯一類型,它在接受仿函數的模板算法中運行良好。

好吧,你實際上是在問一堆不同的問題,可能是因為你並不完全熟悉術語。 我會盡力回答所有問題。

lambda和“operator()”之間有什么區別? - 讓我們改寫一下,“lambda和帶有operator()的對象有什么區別?”

基本上沒什么。 主要區別在於lambda表達式創建功能對象,而具有operator()的對象是功能對象。 最終結果類似於考慮相同但可以使用(params)語法調用的實體。

閉包和仿函數有什么區別? 這也很困惑。 請查看此鏈接:

http://en.wikipedia.org/wiki/Closure_(computer_programming) http://en.wikipedia.org/wiki/Closure_(computer_programming)#C.2B.2B

因此,正如您所看到的,閉包是一種“仿函數”,它在一個范圍內定義,以便它吸收該范圍內可用的變量。 換句話說,它是一個在程序運行期間動態構建的函數,並且該構建過程由包含它的范圍的運行時值參數化。 因此,在C ++中,閉包是lambda,它使用構建lambda的函數中的值。

lambda和接受函數/函子的模板參數有什么區別? - 這再次混淆了。 不同之處在於它們真的沒什么兩樣。 接受函數/函子的模板“參數”已經混淆了措辭,所以我假設“參數”你的意思是“函數”,因為參數不接受任何東西。 在這種情況下,盡管lambda可以接受一個仿函數作為參數,但它不能被模板化,一個。 二,通常lambda是作為參數傳遞給接受仿函數參數的函數的一個。

閉包只是一個具有一些設置對象狀態(范圍?)的仿函數?

正如你可以通過上面的鏈接看到的,沒有。 事實上,封閉甚至沒有狀態,真的。 基於UPON構建它的其他實體的狀態構建閉包,在該仿函數中雖然這不是狀態,但它是對象的結構。

這些結構的“殺手級應用”是什么? 或者也許是典型的用例?

我會改寫一下,“為什么這些東西有用?”

好吧,一般來說,如果任何對象具有operator(),則將其視為函數的能力對於整個事物非常有用。 首先,它允許我們通過使用對象或自由函數來擴展任何stdlib算法的行為。 無法消除這方面的大量有用資源。

更具體地說,lambda表達式,它們只是簡化了這個過程。 對象定義所施加的限制使得在某些情況下使用stdlib算法的過程效率稍低(從開發使用的角度來看,而不是程序效率)。 首先,至少任何作為參數傳遞給模板的對象都必須在外部定義。 我相信這也在改變,但仍然......必須創建整個對象只是為了執行基本的東西,只在一個地方使用,是不方便的。 Lambda表達式允許該定義非常容易,在其使用的地方范圍內等等......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM