天天看點

inline函數傳回值_函數對象的使用

#include 
           

函數對象

FunctionObjectType fo;//定義一個變量
fo(...)//調用operator()
           

函數是一個對象,并不是一個簡單的函數指針:void fo(...)。

  1. 擁有狀态;
  2. 有類型;
  3. 速度比function pointor更快。

例程中,async要調用函數,我們實作了多種調用方式。

  • f1:函數對象是建立出來的;
  • f2:調用了print函數指針,并傳入了參數;
  • f3:使用lamda作為函數參數,引用了b;
  • f4:直接把函數對象傳入;
  • f5:調用成員函數,給出了哪個成員函數,哪個對象的成員函數,及成員函數需要的參數。

LAMDA

C++11 Lambda函數 - WindSun - 部落格園​www.cnblogs.com

inline函數傳回值_函數對象的使用
inline函數傳回值_函數對象的使用
[捕捉清單] (參數) mutable -> 傳回值類型 {函數體}
auto	
           

上例展示如何使用[=]以捕獲父域所有對象的拷貝。

可以把a指派給e,但是不能直接使用a.print()。

上例還展示了如何明确指出傳回值的資料類型。

Lambda與STL

  從C++11開始,Lambda被廣泛用在STL中,比如foreach。與函數指針比起來,函數指針有巨大的缺陷:

1.函數定義在别處,閱讀起來很困難;

2.使用函數指針,很可能導緻編譯器不對其進行inline優化,循環次數太多時,函數指針和Lambda比起來性能差距太大。函數指針不能應用在一些運作時才能決定的狀态,在沒有C++11時,隻能用函數對象。使得學習STL算法的代價大大降低。

但是Lambda并不是仿函數的完全代替者。由Lambda的捕捉清單的限制造成的,僅能捕捉副作用域的變量。放函數具有天生跨作用域共享的特征。