一. 什么是Lambda >>nt3q
所谓Lambda,简单的说就是快速的小函数生成。 "kHQ}#6r
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, Y9K$6lz
-S7y1 ) 7
-q}c;0vL-a
9P M\D@A{
class filler :*`5|'G}
{ }z$_=v
public : =(-oQ<@v
void operator ()( bool & i) const {i = true ;} @/w($w"
} ; f'2Ufd|J|
3ZF- n`
=WYI|3~Cz
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: *u|bmt
c~0hu*&
r/32pY
# RG/B2
for_each(v.begin(), v.end(), _1 = true ); )0Lno|l
^Iz(V2
x2KIGG^
那么下面,就让我们来实现一个lambda库。 ;Rz+4<
ZMI!Sl
etPb^$
EzXGb
二. 战前分析 )225ee>
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 <H,q( :pM
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 ^zv,VD
.+'`A"$8
LWpM-eW1q
for_each(v.begin(), v.end(), _1 = 1 ); c5 ($*tTT
/* --------------------------------------------- */ has \W\(
vector < int *> vp( 10 ); ^F*G
transform(v.begin(), v.end(), vp.begin(), & _1); {} #W~1`
/* --------------------------------------------- */ +].Zs<