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