一. 什么是Lambda A_Frk'{qhB
所谓Lambda,简单的说就是快速的小函数生成。 4DZ-bt'
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, *5 w{8
4_Dp+^JF
()&~@1U
^B8b%'\
class filler CLvX!O(~
{ {uzf"%VtP
public : pTIf@n6I
void operator ()( bool & i) const {i = true ;} )95f*wte
} ; `+6R0Ch
W9NX=gE4
lHgs;>U$
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: rE@T79"
cGjPxG;
\&U>LwZd?
{G?N E
for_each(v.begin(), v.end(), _1 = true ); 9tF9T\jW
#o1=:PQaC
:
]C~gc
那么下面,就让我们来实现一个lambda库。 N('&jHF
(#+^&1
2eMTxwt*S
jLg9H/w{
二. 战前分析 A}eOFu`
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 *_>Lmm.yh
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 .^B*e6DAD
pz"0J_xDM
Lemui)
for_each(v.begin(), v.end(), _1 = 1 ); ,VO2a mI
/* --------------------------------------------- */ 8WnwQ%;m?
vector < int *> vp( 10 ); L3CP`cx
transform(v.begin(), v.end(), vp.begin(), & _1); ZP{*.]Qu
/* --------------------------------------------- */ ~"A+G4jl
sort(vp.begin(), vp.end(), * _1 > * _2); vVOh3{e|
/* --------------------------------------------- */ '],J$ge
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); @S|XGf
/* --------------------------------------------- */ 1GzAG;UUo6
for_each(vp.begin(), vp.end(), cout << * _1 << ' \n ' ); ,v"YqD+GC5
/* --------------------------------------------- */ 6Ybg^0m
for_each(vp.begin(), vp.end(), cout << constant( ' \n ' ) << * _1); T=ev[ mS
-'6Dg
yPq'( PV
AK@9?_D
看了之后,我们可以思考一些问题: c/sC&i;%O
1._1, _2是什么? dAuJXGo
显然_1和_2都满足C++对于标识符的要求,可见_1和_2都是对象。 82l~G;.n3
2._1 = 1是在做什么? &jmRA