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

时间:2011-05-26 18:56:19

标签: c++ coding-style lambda c++11

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

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

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

这不是那么难读,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... 

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

此案例的首选代码约定是什么?我应该写:

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

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

6 个答案:

答案 0 :(得分:9)

我通常会去

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

我写了几百行lambda。

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

嗯...

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

for (auto x : foo)
{
    std::cout << "hello!";
    x += bar()/(1+bar());
    std::cout << x << " ";
}

答案 3 :(得分:2)

我喜欢将lambdas视为另一个函数声明,因此遵循我在其他函数中使用的相同约定:

// when lambdas are present, I break the enveloping method params
for_each(
  foo.begin(), 
  foo.end(),           
  [] (double x)
  // I also like to split the brackets, just like with any function
  {
     std::cout << "hello!" 
     x += bar()/(1+bar());                
    std::cout << x << " ";          
  }); // the closing parenthesis is left with the closing bracket

答案 4 :(得分:1)

我会说如果lambda的代码是多于一个或两个语句,它应该是一个单独的命名函数。

答案 5 :(得分:1)

发布我的

std::vector<int> a;
std::find_if(a.begin()
           , a.end()
           , [&](int i)
             {
                 return i == 0;
             });