适当缩进C++ 11 lambdas

Jea*_*ier 14 lambda indentation c++11

是否有一种可接受的"标准"方法来格式化C++> = 11中的lambda表达式?特别是当放入通用算法时.

例如 :

1)

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

或者2)

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

或者3)

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

或者4)

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

或者回车,空格,制表符的任何其他组合......注意:我在我的代码中使用Allman样式,所以理想情况下它将"适合相同的样式".

Iro*_*ior 11

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

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

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

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

  • @TED如果你的lambda表达式达到50行,那么你遇到的问题比格式化要大.那么多代码可能至少值得一个名字.可能不止一个名字. (6认同)
  • 我现在大部分时间都使用你的第二个例子,在一个大的代码库中,我发现它是最清晰的。 (2认同)

Ser*_* K. 9

目前还没有法律上的标准方式.但是,您可以轻松采用自己喜欢的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);
                }
            }
        );
Run Code Online (Sandbox Code Playgroud)

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

在我的拙见中,(1)和(4)打破了缩进的精神(他们没有强调整个lambda块的逻辑结构).我不会用它们.