1. 程式人生 > >關於常用的Lambda(拉姆達)表示式

關於常用的Lambda(拉姆達)表示式

ISO C++ 11 標準的一大亮點是引入Lambda表示式。基本語法如下: [capture list] (parameter list) ->return type { function body } 其中除了“[ ]”(其中捕獲列表可以為空,可以是this)和“複合語句”(相當於具名函式定義的函式體),其它都是可選的。它的型別是唯一的具有成員operator()的非聯合的類型別,稱為閉包型別(closure type):閉包是可以包含自由(未繫結到特定物件)變數的程式碼塊。 示例一個觸控開始事件:
rockerRangeEvent->onTouchBegan=[this](Touch* touch,Event* e){
    
    return false;
};
C++中,一個lambda表示式表示一個可呼叫的程式碼單元。我們可以將其理解為一個未命名的行內函數。它與普通函式不同的是,lambda必須使用尾置返回來指定返回型別,用於確定表示式是否再往下執行? 一個更清楚詳細的示例:例如呼叫<algorithm>中的std::sort,ISO C++ 98 的寫法是要先寫一個compare函式
boolcompare(int&a,int&b)
{
    return a>b;//降序排序
}

然後,再這樣呼叫:  
sort(a,a+n,compare);
然而,用ISO C++ 11 標準新增的Lambda表示式,可以這麼寫:
sort(a,a+n,[](inta,intb){returna>b;});//降序排序
ISO C++14支援基於型別推斷的泛型lambda表示式。上面的排序程式碼可以這樣寫:
sort(a,a+n,[](constauto&a,constauto&b){returna>b;});//降序排序:不依賴a和b的具體型別

由於Lambda的型別是唯一的,不能通過型別名來顯式宣告對應的物件,但可以利用auto關鍵字和型別推導:
autof=[](inta,intb){returna>b;};

以上,Lambda表示式有助於重構程式碼,避免書寫過於複雜的引數型別。特別地,不需要顯式指出引數型別使使用高階函式變得更加容易。