适当缩进C ++ 11 lambdas

时间:2014-10-22 15:13:07

标签: c++11 lambda indentation

是否已接受"标准"在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样式,因此理想情况下它将符合相同的样式"。

3 个答案:

答案 0 :(得分:11)

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

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

或(例如,如果λ体对于一条线太长)

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

答案 1 :(得分:9)

还没有 de jure 标准方式。但是,您可以轻松采用自己喜欢的C ++风格。例如,即兴的奥曼风格:

        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块的逻辑结构)。我不会用它们。

答案 2 :(得分:1)

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

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

或者,对于更长的lambdas:

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

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