Какая логика стоит за этим форматированием лямбды clang-форматом?

я использую clang-format (версия 3.5) с Emacs (версия 24.5.2). Вот простой кусок кода, отформатированный clang-format в стиле LLVM:

int main() {
std::cout << "> ";
std::string word;
while (std::cin >> word) {
std::cout << std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0');
}) << std::endl << "> ";
}
return 0;
}

Обратите внимание, как он выровнял тело и закрывающую скобку lambda, Есть ли какая-то логика в этом форматировании или это просто отсутствие поддержки lambdas? Есть ли параметры конфигурации clang-format что мне нужно установить для лучшего форматирования?

4

Решение

std::accumulate(word.cbegin(), word.cend(), 0, [](int cur, char ch) { return cur + (ch - '0'); })

Здесь у нас есть длинный вызов функции. Чтобы очистить его, мы берем длинный аргумент и разбиваем его на собственную строку:

std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) { return cur + (ch - '0'); })

когда мы делаем это, мы добавляем аргумент в соответствие с (:

std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) { return cur + (ch - '0'); })

Все идет нормально. Теперь у нас есть открытый {, Ну, это означает, что новая строка

std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0'); })

с отступом. Где основание отступа? Ну, начало std::accumulate, Добавьте 4 пробела:

std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0'); })

тогда мы попали в }, Новая строка, backdent:

std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0');
})

наконец, вставьте это в середину большего выражения, и вы получите беспорядок, который вы имели выше.

Вышесказанное является чисто обоснованной историей, не основанной на опыте clang-format, Я не могу сказать вам, как сделать это лучше.

2

Другие решения

Вы могли бы хотеть AlignAfterOpenBracket: false принести это [] оставил.

На мой взгляд, выравнивание после открытой скобки вызывает слишком много пустого пространства, поэтому удивительно, что оно так популярно. использование ContinuationIndentWidth контролировать, как далеко отступы должны быть продолжения.

Лямбды до сих пор не выровнены идеально, но, по крайней мере, ваше лямбда-отверстие не находится за милю вправо. Я не совсем доволен форматированием лямбд в clang-формате.

0

По вопросам рекламы [email protected]