#include
函數對象
FunctionObjectType fo;//定義一個變量
fo(...)//調用operator()
函數是一個對象,并不是一個簡單的函數指針:void fo(...)。
- 擁有狀态;
- 有類型;
- 速度比function pointor更快。
例程中,async要調用函數,我們實作了多種調用方式。
- f1:函數對象是建立出來的;
- f2:調用了print函數指針,并傳入了參數;
- f3:使用lamda作為函數參數,引用了b;
- f4:直接把函數對象傳入;
- f5:調用成員函數,給出了哪個成員函數,哪個對象的成員函數,及成員函數需要的參數。
LAMDA
C++11 Lambda函數 - WindSun - 部落格園www.cnblogs.com
[捕捉清單] (參數) mutable -> 傳回值類型 {函數體}auto
上例展示如何使用[=]以捕獲父域所有對象的拷貝。
可以把a指派給e,但是不能直接使用a.print()。
上例還展示了如何明确指出傳回值的資料類型。
Lambda與STL
從C++11開始,Lambda被廣泛用在STL中,比如foreach。與函數指針比起來,函數指針有巨大的缺陷:
1.函數定義在别處,閱讀起來很困難;
2.使用函數指針,很可能導緻編譯器不對其進行inline優化,循環次數太多時,函數指針和Lambda比起來性能差距太大。函數指針不能應用在一些運作時才能決定的狀态,在沒有C++11時,隻能用函數對象。使得學習STL算法的代價大大降低。
但是Lambda并不是仿函數的完全代替者。由Lambda的捕捉清單的限制造成的,僅能捕捉副作用域的變量。放函數具有天生跨作用域共享的特征。