一. 什么是Lambda (u'/tNGS
所谓Lambda,简单的说就是快速的小函数生成。 b5)>h
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, T8m%_U#b
AT9SD vJ
kXj pCtCu
r2Z`4tN:
class filler ^X;>?_Bk
{ x)U;
public : 87>Qw,r
void operator ()( bool & i) const {i = true ;} 5g5pzww
} ; ut,"[+J
'{u#:TTj
AdYQhF##
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: iLI]aZ
O0l;Qi
2bC%P})m
Z)&HqqT3p
for_each(v.begin(), v.end(), _1 = true ); r 1a{Y8?
|V7a26h
Cwh;+3?C|
那么下面,就让我们来实现一个lambda库。 >k jJq]A2
7U7 i2 4
ujh4cp
g !8lW
二. 战前分析 xr2:bu
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 O:x%!-w
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 %G
SSy_c
qprOxP
r
]mh+4k?b
for_each(v.begin(), v.end(), _1 = 1 ); K!~](_W!
/* --------------------------------------------- */ q<8HG_
vector < int *> vp( 10 ); [<;2 C
transform(v.begin(), v.end(), vp.begin(), & _1); m>!#}EJ|
/* --------------------------------------------- */ t*#&y:RG
sort(vp.begin(), vp.end(), * _1 > * _2); =R"tnjR
/* --------------------------------------------- */ 5S?yj
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); k}.nH"AQ
/* --------------------------------------------- */ `y#C%9#
for_each(vp.begin(), vp.end(), cout << * _1 << ' \n ' ); 4\3t5n
/* --------------------------------------------- */ n58jB:XR(
for_each(vp.begin(), vp.end(), cout << constant( ' \n ' ) << * _1); PsnU5f)`
~-%A@Lt
7A6sSfPUy
y|se^dn
看了之后,我们可以思考一些问题: x TZ5q*Hqx
1._1, _2是什么? U8KY/!XZ
显然_1和_2都满足C++对于标识符的要求,可见_1和_2都是对象。 A'8K^,<