是否已接受"标准"在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样式,因此理想情况下它将符合相同的样式"。
答案 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就有更多的空间在右边。