Lambda表達式:代替std::bind的絕佳方法
lambda表達式使得函數指針有了更靈活的使用方法,但是有些時候,對于大型的函數,還是不建議用lambda表達式,誰也不想在函數里又看到一段長長的函數。
Lambda表達式的用法在:C++11 lambda表達式在for_each和transform算法下的使用已經進行了介紹。另外我在另一篇文章利用C++11的function和bind功能,實現QStandardItemModel的通用遍歷函數里使用了std::bind功能,這個函數是為了把一個多變量的函數指針轉變?yōu)橐粋€指定變量的函數指針
例如有個函數如:
void?fun1(int?a)
但實際上你可能想要傳入的函數是這樣寫的:
void?funMy(int?a,double*?b,float?other)
這時,可以通過std::bind來實現函數的綁定。std::placeholders::_1這種占位符就是用在變量綁定的,但是橫看豎看都覺得別扭
上面的例子得這樣寫
double??b?=?1.0; float?other?=?2.0; std::bind(funMy,std::placeholders::_1,&b,other));
當然,如果你不知道還有·std::bind·這樣的函數,你可能會這樣寫:
void?funMy_2(int?a)
{
????double??b?=?1.0;
????float?other?=?2.0;
????funMy(a,&b,other?);
}這樣就把那個三參數的funMy(int a,double* b,float other)轉換為單參數的fun1(int a),使得函數指針的參數一致,但是得再寫一個函數好麻煩的……
但是有了Lambda表達式后,第二種之前比較不好的方式反而變得更好
因為funMy_2可以這樣代替:
double??b?=?1.0;
float?other?=?2.0;
[&](int?a){funMy(a,&b,other?);}直接就產生一個匿名的void(*(int))函數指針!





