??? 對(duì)于lambda庫(kù)的介紹,大家還是去看boost文檔。我對(duì)lambda的原理也是一知半解,有興趣的可以去學(xué)習(xí)一些函數(shù)式編程語(yǔ)言的相關(guān)理論。
lambda的使用方式確實(shí)顛覆了傳統(tǒng)的過(guò)程式語(yǔ)言的一些方面。
???
在C++中,可以這樣理解:lambda的功能就是把一段代碼當(dāng)作參數(shù),傳給一個(gè)函數(shù)。在被調(diào)用函數(shù)中,會(huì)用這段參數(shù)代碼作一個(gè)處理。而且這段參數(shù)代碼并
不是只能寫一些靜態(tài)的過(guò)程,它可以有參數(shù)。在C++中,這段參數(shù)代碼實(shí)際上是一個(gè)functor.
我們看一個(gè)最簡(jiǎn)單的例子:
vector<int> v(10)
for_each(v.begin(), v.end(), cout << _1 << '\n');
這個(gè)cout << _1 << '\n',就是一個(gè)lambda函數(shù)。
lambda并不是只能處理這樣簡(jiǎn)單的例子,還可以有分支、循環(huán)等控制語(yǔ)句。正好工作中用到,順便貼出來(lái)。
例子說(shuō)明:這是一個(gè)收集windows信息的代碼的一部分,下面這段代碼是收集磁盤類型和磁盤空間的。
using namespace boost::lambda;
//下面三行,是因?yàn)閣indows API是__stdcall修飾的,因此,用function來(lái)包裝一下。
boost::function<UINT (LPCTSTR)> drtype = ::GetDriveType;
boost::function<BOOL (LPCTSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD)>
drfree = ::GetDiskFreeSpace;
DWORD dwSectorsPerCluster, dwBytesPerSector,
NumberOfFreeClusters, dwTotalNumberOfClusters;
//log 是預(yù)定義的,ostream類型
log << "DriveType=";
//dl是盤符列表
for_each(dl.begin(), dl.end(),
( //這個(gè)“(“不能少,你就當(dāng)它是{看待
log << _1 << " " // 這個(gè)很簡(jiǎn)單
<< bind(drtype, bind(&string::c_str, _1)), //這個(gè),相當(dāng)于導(dǎo)致drtype(_1.c_str())
//上面的","是被lambda重載的,你當(dāng)它是“;”
if_ //這個(gè)相當(dāng)于if
(
bind(drfree, bind(&string::c_str, _1)
, &dwSectorsPerCluster, &dwBytesPerSector
, &NumberOfFreeClusters, &dwTotalNumberOfClusters
) > 0 //這個(gè)好長(zhǎng),其實(shí)很簡(jiǎn)單:drfree(1.c_str(), ...) > 0;
)
[ //這個(gè)也是重載的,當(dāng)它是“{“
log << constant(" ") //這個(gè)constant是一定要的,這樣這一行才能成為一個(gè)lambda表達(dá)式
<< var(dwSectorsPerCluster) << constant(" ")
<< var(dwSectorsPerCluster) << constant(" ")
<< var(dwBytesPerSector) << constant(" ")
<< var(NumberOfFreeClusters) << constant(" ")
<< var(dwTotalNumberOfClusters)
],
log << constant(", ")
)
);
log << END_LINE;
??? 在寫比較長(zhǎng)的lambda的時(shí)候,掌握一個(gè)原則,就很簡(jiǎn)單了。
????
我把一個(gè)lambda表達(dá)式叫做一個(gè)lambda算子,lambda表達(dá)式只能由lambda算子構(gòu)成。lambda算子之間的運(yùn)算組合,仍然是
lambda算子。一個(gè)普通的C++對(duì)象,必須首先轉(zhuǎn)型成lambda算子才能參與lambda運(yùn)算。一個(gè)復(fù)雜的lambda表達(dá)式必須注意檢查每一個(gè)環(huán)
節(jié),確保都是lambda算子(或者可以隱式轉(zhuǎn)換的)。這樣,結(jié)合運(yùn)算符重載的知識(shí),就不難寫出復(fù)雜的lambda表達(dá)式了。
ps:在vc7.1中,lambda表達(dá)式有錯(cuò)誤時(shí),編譯出錯(cuò)信息可是非常壯觀的,不是一般的壯觀哦