【问题标题】:Proper indentation for C++11 lambdasC++11 lambda 的正确缩进
【发布时间】:2014-10-22 15:13:06
【问题描述】:

在 C++ >= 11 中是否有一种公认的“标准”方式来格式化 lambda 表达式?尤其是当放入通用算法时。

例如:

1)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] (const Element& e)
{ return e.id() == id;});

或者 2)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] 
                       (const Element& e)
                       { return e.id() == id;});

或者 3)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] (const Element& e)
                       { 
                           return e.id() == id;
                       });

或 4)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] (const Element& e)
{ 
    return e.id() == id;
});

或回车、空格、制表符的任何其他组合... 注意:我在我的代码中使用 Allman 风格,所以理想情况下它会“符合相同的风格”。

【问题讨论】:

  • 不,请注意我不喜欢其中任何一个;P
  • 显然是见仁见智。一方面,我不会投票关闭它,因为我想看到答案和投票。
  • 选项 4 在我看来是最糟糕的,因为它完全混淆了花括号包围的块是 lambda 主体,首先当 lambda 的捕获和参数部分写在同一个行作为分配给it

标签: c++11 lambda indentation


【解决方案1】:

我一直倾向于为缩进的相对级别赋予它们自己的语义值,并将结束定界符与包含其匹配的开始定界符的行垂直对齐。这使得复杂的语句(比如那些以 lambda 表达式作为参数的语句)更容易阅读:

auto it = std::find_if(
  myVec.begin(),
  myVec.end(),
  [id = 42] (const Element& e){ return e.id() == id;}
);

或者(例如,如果 lambda 主体对于一行来说太长)

auto it = std::find_if(
  myVec.begin(),
  myVec.end(),
  [id = 42] (const Element& e){ 
    return e.id() == id;
  }
);

【讨论】:

  • 我现在大部分时间都使用您的第二个示例,并且在大型代码库中我发现它是最清晰的。
  • 我在第二个例子中遇到了很长的 lambdas 问题。我最近遇到了一个 50 行的示例,它确实做到了这一点,并且很难注意到这一特定缩进级别中的代码根本不是封闭函数的一部分。
  • @T.E.D.如果您的 lambda 表达式达到 50 行,那么您遇到的问题比格式化更大。至少,这么多代码可能值得一个名字。可能不止一个名字。
【解决方案2】:

目前还没有法理标准方式。但是,您可以轻松采用自己喜欢的 C++ 风格。例如,即兴的 Allman 风格:

        std::for_each(
            m_pages[i].begin() + m_pageSize,
            m_pages[i].end(),
            [this, i, &insertPlace](const CItemRef& item)
            {
                if(!item->IsOK())
                {
                    insertPlace = m_pages[i+1].insert(insertPlace, item);
                }
            }
        );

这是你的号码 (3)。数字 (2) 可用于单行。

以我的拙见,(1) 和 (4) 打破了缩进的精神(它们并不强调整个 lambda 块的逻辑结构)。我不会使用它们。

【讨论】:

  • 这几乎是他的第三名,只是修复了糟糕的函数调用格式。
  • #1 和 #4 是我的 IDE (QtCreator) 在我自动缩进时是如何做到的,这让我很生气,但因为它似乎是默认设置,所以我把它放在这里......跨度>
  • @Raspu 点了!谢谢!
【解决方案3】:

就我个人而言,我不喜欢在左边浪费空格,所以我喜欢把我的多个参数加上一个额外的标准缩进级别,从下一行开始:

auto it = std::find_if(
    myVec.begin(),
    myVec.end(),
    [id = 42](const Element& e) { return e.id() == id; }
    );

或者,对于更长的 lambda:

auto it = std::find_if(
    myVec.begin(),
    myVec.end(),
    [id = 42](const Element& e) { 
        return e.id() == id; 
    }
    );

因此,无论函数名称长度如何,我的函数参数都以相同的缩进开始(在一个范围内),这样右侧的 lambda 就有更多空间。

【讨论】:

  • 我会把); 刷到左边,否则是的,这就是这个
猜你喜欢
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2010-10-14
  • 2010-10-15
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多