一. 什么是Lambda Lrgv:n
所谓Lambda,简单的说就是快速的小函数生成。 LlP_`fA
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, i DV.L
d/G`w{H}y
kAbRXID
.'C$w1[w
class filler ngoo4}
{ |?n=~21"1O
public : .%7#o
void operator ()( bool & i) const {i = true ;} l@Vl^f~ P
} ; -o<L%Y<n2
`#&pB0.y
E.]sX_X?
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: [#>ji+%=
wkK61ah6
m5lMh14E
RwMK%^b
for_each(v.begin(), v.end(), _1 = true ); 76a+|TzR
6'UtB !gr
w?6"`Mo
那么下面,就让我们来实现一个lambda库。 ,.tv#j|A
YB/A0 J
T_bk%
kVk^?F
二. 战前分析 5K13
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 8Czy<}S<G
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 gNJ,Bj Pd
jA R@?X
hc}dS$=C
for_each(v.begin(), v.end(), _1 = 1 ); vh3Xd\N
/* --------------------------------------------- */ 7q*L-Xe]k
vector < int *> vp( 10 ); f>i6f@
transform(v.begin(), v.end(), vp.begin(), & _1); (SV(L~T_
/* --------------------------------------------- */
*r Y6
sort(vp.begin(), vp.end(), * _1 > * _2); (.a:jL$
/* --------------------------------------------- */ xg~q'>
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); _ETG.SYq
/* --------------------------------------------- */ [@Y<:6
for_each(vp.begin(), vp.end(), cout << * _1 << ' \n ' ); deSrs:.
/* --------------------------------------------- */ m`!C|?hu
for_each(vp.begin(), vp.end(), cout << constant( ' \n ' ) << * _1); bj4cW\b(
_y&m4V