Правильный отступ для С++ 11 lambdas
Есть ли принятый "стандартный" способ форматирования лямбда-выражений в С++ >= 11? Особенно, если вставить общие алгоритмы.
Например:
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 в своем коде, поэтому в идеале он будет "соответствовать одному и тому же стилю".
Ответы
Ответ 1
Я всегда предпочитал придавать относительные уровни отступа с их собственным семантическим значением и вертикально выравнивать ограничитель закрытия с линией, содержащей соответствующий разделительный разделитель. Это упрощает чтение сложных операторов (например, с лямбда-выражениями в качестве аргументов):
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;
}
);
Ответ 2
Пока нет стандартного способа de jure. Однако вы можете легко использовать свой любимый стиль С++. Например, импровизированный стиль 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) нарушают дух отступов (они не подчеркивают логическую структуру всего лямбда-блока). Я бы не использовал их.
Ответ 3
Лично мне не нравится потраченное пустое поле слева, поэтому мне нравится ставить несколько аргументов с одним дополнительным уровнем стандартного отступа, начиная со следующей строки:
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;
}
);
Итак, независимо от длины имени функции, мои аргументы функции начинаются с одного и того же отступа (в области), и таким образом есть больше места для вашей лямбды справа.