一. 什么是Lambda {%z5^o1)
所谓Lambda,简单的说就是快速的小函数生成。 }LX.gm
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, @XH@i+{B
Gk)6ljL
g?>
C{YTHNn
class filler :(i=> ~O
{ XZxzw*Y1J
public : Wbi12{C
void operator ()( bool & i) const {i = true ;} 7qg. :h
} ; 6g"qwWZp
<4*)J9V^s=
)Nl xW5
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: WU6F-{M"?
TWU1@5?Ct
Kj+TPqXb
oi%IHX(`
for_each(v.begin(), v.end(), _1 = true ); xgWVxX^)
D}?JX5.
wArzMt}[
那么下面,就让我们来实现一个lambda库。 OJs
s
n&FRjq9y
-V:7j8
2MDY nMy
二. 战前分析 `%=!_|
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 ];Y tw6A
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 V.w!]{xm
HCa EETk5
B`|H}KU
for_each(v.begin(), v.end(), _1 = 1 ); *4g:V;L
/* --------------------------------------------- */ @Cl1G
vector < int *> vp( 10 ); $wqi^q*)
transform(v.begin(), v.end(), vp.begin(), & _1); m[A$Sp_"-h
/* --------------------------------------------- */ ,sn
9&E
sort(vp.begin(), vp.end(), * _1 > * _2); - S%8
/* --------------------------------------------- */ {?]&