一. 什么是Lambda
O0';j!?X
所谓Lambda,简单的说就是快速的小函数生成。 Cddw\|'3
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, \oLRNr[F
*ZF7m_8u{
(X QgOR#
&
/UcFB
class filler Quc9lL
{ ,8cw jS2E
public : P ;PS+S9
void operator ()( bool & i) const {i = true ;} R0,
Q`
} ; 8yA: C
nW!rM($q
fA2H8"r
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: 2<
w/GX.
T/dchWG
f[!N]*
&tkkn2t
for_each(v.begin(), v.end(), _1 = true ); K({+3vK
/`?i&\C3r
?&pjP,a
那么下面,就让我们来实现一个lambda库。 _{TGO
jZr
G6]M~:<i
)CYSU(YTD
W9t%:wF
二. 战前分析 Dwe_ytjpc
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 tB8XnO_c
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 K q: +{'
}<9*eAn`
t8E'd:pE
for_each(v.begin(), v.end(), _1 = 1 ); W5<1@
/* --------------------------------------------- */ Etg'"d@[
vector < int *> vp( 10 ); n$F&gx'^
transform(v.begin(), v.end(), vp.begin(), & _1); '9H7I! L@
/* --------------------------------------------- */ C>4y<