调整 C++20 范围管道的 clang-format

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|

Fei*_*ims 1

有一个针对 的功能请求AllowBreakingBinaryOperators。在功能完成之前,只能做出妥协。

  1. 正如您所说,使用//注释强制换行。
  2. 用于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可能会有所帮助。