Ben*_*Ben 12 c++ clang-format c++20 std-ranges
C++20(以及带有 的 23 std::ranges::to<T>())惯用地使用operator|来创建如下所示的转换管道:
return numbers
| std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * 2; })
| std::ranges::to<std::vector>();
Run Code Online (Sandbox Code Playgroud)
根据我的项目的当前情况.clang-format,看起来像
return numbers | std::views::filter([](int n) { return n % 2 == 0; }) |
std::views::transform([](int n) { return n * 2; }) | std::ranges::to<std::vector>();
Run Code Online (Sandbox Code Playgroud)
我觉得很难读。如果我设置BreakBeforeBinaryOperators: All我得到
return numbers | std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * 2; }) | std::ranges::to<std::vector>();
Run Code Online (Sandbox Code Playgroud)
哪个更好,但我真的很喜欢原始版本,每一行都有一个管道操作。
我可以调整列限制,但这是一个重大变化,并且还开始对我的 lambda 进行换行,这是我不喜欢的:
return numbers | std::views::filter([](int n) {
return n % 2 == 0;
})
| std::views::transform(
[](int n) { return n * 2; })
| std::ranges::to<std::vector>();
Run Code Online (Sandbox Code Playgroud)
我可以手动使用空注释来强制换行:
return numbers //
| std::views::filter([](int n) { return n % 2 == 0; }) //
| std::views::transform([](int n) { return n * 2; }) //
| std::ranges::to<std::vector>();
Run Code Online (Sandbox Code Playgroud)
但同样,知道管道将非常普遍并不理想。我缺少设置吗?或者这更像是我应该直接提出的功能请求,例如“添加一个选项,以便当表达式中出现clang-format多个 n 时,将每个子表达式放在自己的行上。”operator|
有一个针对 的功能请求AllowBreakingBinaryOperators。在功能完成之前,只能做出妥协。
//注释强制换行。clang-format off/on禁用 clang-format 并自行格式化。这是一个结合了两者的更复杂的解决方案:
void function() {
return numbers | std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * 2; })
| std::views::take(3) | std::ranges::to<std::vector>();
}
Run Code Online (Sandbox Code Playgroud)
首先,使用//split 来分割代码,然后对代码进行 clang 格式。
void function() {
return numbers
//
| std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * 2; })
| std::views::take(3)
//
| std::ranges::to<std::vector>();
}
Run Code Online (Sandbox Code Playgroud)
接下来,删除//,用于clang-format off/on禁用 clang-format。
void function() {
// clang-format off
return numbers
| std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * 2; })
| std::views::take(3)
| std::ranges::to<std::vector>();
// clang-format on
}
Run Code Online (Sandbox Code Playgroud)
至于矩阵,该选项AlignArrayOfStructures可能会有所帮助。