一. 什么是Lambda =~W=}
所谓Lambda,简单的说就是快速的小函数生成。 -~(d_
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, 6XCFL-o-
T+RC#&>
"Vl4=W)u
WPpO(@sn
class filler T4}Wg=UKg
{ 8_Uhh5[
public : ':tdb$h
void operator ()( bool & i) const {i = true ;} @x!+_z
} ; =6 zK1Z
t\YM Hq<Y
Nr*X1lJ6
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: fdwP@6eh
>/ A'G
GNrRc3dr$
+C,/BuG
for_each(v.begin(), v.end(), _1 = true ); z>y#^f)r
?>V>6cDQ
t54?<-
那么下面,就让我们来实现一个lambda库。 XHJ`C\xR
!J@!2S9
E>5p7=Or;"
:O&jm.2m
二. 战前分析 BAvz @H
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 88S:E7
$
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 1$C?+H
HIE8@Rv/3
^LB]
for_each(v.begin(), v.end(), _1 = 1 ); f2M*]{N
/* --------------------------------------------- */ Dyo^O=0c
vector < int *> vp( 10 ); xz.M'az\
transform(v.begin(), v.end(), vp.begin(), & _1); @K*W3&