对 C++ 中 Lambda Function 的一点感想

最近喜欢上了 C++ 中的 lambda function ,动不动就 for_each 一个 lambda ,或者 find_if 一个lambda 。

lambda function 是在 C++11 标准里的。gcc 要加上 --std=c++0x 参数,MSVC 要求至少 2010 版本。


在此先扯一下 C++ 跟 C 的区别。个人认为主要有4点(从提高编程效率的角度):

  1. class, OOP
  2. STL
  3. template, metaprogramming
  4. 语法的增强,例如变量定义不用写在函数开头(在 for 循环内也可以定义变量),各种重载,inline,等等。


很多人,说会用 C++,但其实只会1和4而已。这充其量也只能称为 C+ 罢了。还是用 C 的思路,去写 C++ 的代码。

我编程的原则之一,就是要追求代码简洁和效率,能够重用的就尽量重用。而且简洁的代码也提高了可读性。当然,为了执行效率而展开 inline 或者 for 循环之类的除外。


扯远了,言归正传。

lambda function,或者 lambda expression,是属于第4类。它有点类似于function object (当然 C++ 里没有这个东西,借用了 js 的概念) 或者 function pointer。因此它可以跟STL很好地结合起来。

比如 for_each,find_if 这些函数,都需要一个function pointer 作为参数。这是 lambda function 发挥作用的主要地方。

但如果 lambda function 就跟 function pointer 一样,那就没引入的必要了。它的独特之处,就在于可以 capture 局部变量。这就是 C 的 function pointer 望尘莫及之处了。有了这点,lambda function 就是名副其实的 function in function。


举个例子。

比如有一段 switch 代码,有几十种 case 要处理,很多 case 都有一段共同的处理代码(而且写起来还不短)。那段代码还用到了 那个 switch 之前的 N 个局部变量。

用 C 的做法,就是建一个 global function,把那 N 个变量当作参数传进去。为了代码简洁,还可以 #define 一个 macro 来调用那个 function。

但事实上,这段代码,也就这个 switch 里面才会用到。能 local 解决的就不要 global 解决。变量都是用到的时候再定义。(没有人会在 cpp 开头定义几百个 global 变量,然后在 function 里面一个局部变量都不定义吧。)

用 C++ 的做法是,建一个 lambda function 来包含那段共用的代码,同时可以 capture 之前的 局部变量。(少写 N 个参数啊!如果调用 M 次,就少写了 N*M 次)。

把这个lambd function 赋值给一个变量,然后直接把这个变量当作 function 来调用。目前储存 lambda 变量可以用2种 type,一是 function pointer,二是 auto。推荐用 auto,避免了 function pointer 严格的类型限制。


你可能感兴趣的:(C/C++/MFC,Tricks)