一. 什么是Lambda Zd>ZY,-5
所谓Lambda,简单的说就是快速的小函数生成。 ^`&HWp
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, /!bx`cKG
[:i sZG*
R^9"N?Q7;`
k.Zll,s
class filler ?"@ET9
{ md6*c./Z
public : 3%NE/lw1
void operator ()( bool & i) const {i = true ;} K<,Y^3]6?
} ; N&B>#:
dy_.(r5[L]
\r]('x3S
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: Za\RM[Z!I
silp<13HN
5c~'!: 7
Ck(.N
for_each(v.begin(), v.end(), _1 = true ); v,\93mNp[
SY6r 8RK
|p'i,.(c_W
那么下面,就让我们来实现一个lambda库。 K%<GU1]-]
d2ofxfpg+
/:6Q.onmLn
bD@@tGr;W
二. 战前分析 pSrsp r
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 h]C2 8=N
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 7Jc<.Z"/Gd
W}k[slqZA
~\bHfiIDy
for_each(v.begin(), v.end(), _1 = 1 ); Fhi5LhWe+.
/* --------------------------------------------- */ `Y\QUj
vector < int *> vp( 10 ); 1OPfRDn.bk
transform(v.begin(), v.end(), vp.begin(), & _1); 8g5.7{ky
/* --------------------------------------------- */ !'PlDGD
sort(vp.begin(), vp.end(), * _1 > * _2); QAXYrRu
/* --------------------------------------------- */ 7+S44)w}~
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); Lnx2xoNk
/* --------------------------------------------- */ 2^bgC~2C1
for_each(vp.begin(), vp.end(), cout << * _1 << ' \n ' ); ./!KE"!
/* --------------------------------------------- */ ^=#!D[xj>
for_each(vp.begin(), vp.end(), cout << constant( ' \n ' ) << * _1); q/J3cXa{K
(v|`LmV
f}-v
"sIN86pCs
看了之后,我们可以思考一些问题: ypT9 8
1._1, _2是什么? &O{t^D)F
显然_1和_2都满足C++对于标识符的要求,可见_1和_2都是对象。 d:3= 1x
2._1 = 1是在做什么? <