一. 什么是Lambda wg^#S
所谓Lambda,简单的说就是快速的小函数生成。 3^q,'!PfB
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, 4} 'Xrg
O;ZU{VY
7]d396%
6LL/wemq
class filler ul/= 1]1?
{ _Z.lr\
public : Km8btS]n
void operator ()( bool & i) const {i = true ;} I.Co8is
} ; TOn{o}Y B
l]WVgu
#w*1 !
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: 1 <.I2\^
\2U^y4K.
ED"@!M`1
<>A:Oi3^
for_each(v.begin(), v.end(), _1 = true ); a k@0M[d
@j`_)Y\
g[@Kd
那么下面,就让我们来实现一个lambda库。 2JYp.CJv
4wX{ N
mwZesSxB_
XPd>DH(Yc
二. 战前分析 pAtHU(}
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 p H5IBIf'
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 Op,Ce4A
bENfEOf,
=#&K\
for_each(v.begin(), v.end(), _1 = 1 ); hc5M)0d
/* --------------------------------------------- */ &}nU#)IX
vector < int *> vp( 10 ); }5RfY| ;
transform(v.begin(), v.end(), vp.begin(), & _1); i^G/)bq
/* --------------------------------------------- */ J<p<