使用c ++ 11 lambda的代码可读性

Raf*_*ini 8 c++ lambda coding-style c++11

我真的很喜欢lambdas并且有能力在C++中使用它是一种乐趣.但是,因为我已经习惯了Haskell,lambdas非常适合语法,我正在努力学习如何在C++中使用它们而不会编写难以理解的混乱长代码行.

所以,举个例子,假设我写这个:

vector<double> foo(10,0.2);
for_each(foo.begin(), foo.end(), [](double x){ std::cout << x << " ";})
Run Code Online (Sandbox Code Playgroud)

这不是那么难读,lambda表达式非常小.但是如果我在for_each中有两个或三个行长函数,这可能会成为我的代码阅读技能的问题:

vector<double> foo(10,0.2);
randomNumberGenerator bar;
for_each(foo.begin(), foo.end(), [](double x){ std::cout << "hello!"; x+=bar()/(1+bar()); std::cout << x << " ";})
//sorry, I couldn't think of a less stupid example... 
Run Code Online (Sandbox Code Playgroud)

这条线开始变得烦人的长,难以阅读我的口味......

对于这种情况,您首选的代码约定是什么?我应该写:

for_each(foo.begin(), foo.end(), 
          [] (double x) {
                std::cout << "hello!"
                x += bar()/(1+bar());
                std::cout << x << " ";
          });
Run Code Online (Sandbox Code Playgroud)

或类似的东西?我仍然认为这种语法有点不自然,难以阅读...... :(

Pup*_*ppy 9

我经常去

for_each(foo.begin(), foo.end(), [](double x) {
    std::cout << "hello!"
    x += bar()/(1+bar());
    std::cout << x << " ";
});
Run Code Online (Sandbox Code Playgroud)

我写了几百行lambdas.

  • +1:我还没有写过很多lambdas,但是在学习它们时从阅读它们看起来通常看起来像一个循环或其他块的主体.在这些情况下,使用内联lambda代码与循环代码内联一样自然.我认为你应该使用相同的原因来移动lambda内容(或不将内容移动到线外),就像你用于其他循环体一样. (2认同)

ild*_*arn 6

如果您愿意,可以单独命名lambda auto:

auto const baz = [](double x)
{
    std::cout << "hello!"
    x += bar()/(1+bar());
    std::cout << x << " ";
};
std::for_each(foo.begin(), foo.end(), baz);
Run Code Online (Sandbox Code Playgroud)