使用clang-format保留完整函数的短lambda用作中间参数

αλε*_*λυτ 7 c++ lambda clang-format

我想用clang-format格式化代码,并完整保留lambda用作中间函数参数:

void f()
{
    func(this, [this] { return false; }, this);
}
Run Code Online (Sandbox Code Playgroud)

我尝试用clang格式9.0进行的所有操作都将参数包装到下一行,即:

void f()
{
    func(
        this, [this] { return false; }, this);
}
Run Code Online (Sandbox Code Playgroud)

如果没有第一个或/和最后一个参数,则即使内置-style='WebKit'选项也可以提供所需的结果:

void f()
{
    func([this] { return false; }, this); // ok
    func(this, [this] { return false; }); // ok 
    func([this] { return false; });       // ok 
}
Run Code Online (Sandbox Code Playgroud)

自LLVM 8.0起,似乎有所更改(损坏),因为7.1可根据需要工作。

Gio*_*ova 2

最新版本clang-format(即 10)具有特定于格式化 lambda 的配置选项。具体来说,您所要求的可以通过为配置指令分配AllowShortLambdasOnASingleLinevalue来实现SLS_Inline

以下是官方文档中提供的其他选项:

允许单行短 Lambda (ShortLambdaStyle)

根据值, auto lambda { return 0; } 可以放在一行中。

可能的值:

SLS_None(在配置中:无)切勿将 lambda 合并到一行中。

SLS_Empty(在配置中:空)仅合并空 lambda。

auto lambda = [](int a) {}
auto lambda2 = [](int a) {
    return a;
};
Run Code Online (Sandbox Code Playgroud)

SLS_Inline(在配置中:内联)如果函数的参数将 lambda 合并到单行中。

auto lambda = [](int a) {
    return a;
};
sort(a.begin(), a.end(), ()[] { return x < y; })
Run Code Online (Sandbox Code Playgroud)

SLS_All(在配置中:全部)将所有 lambda 合并到一条线上。

auto lambda = [](int a) {}
auto lambda2 = [](int a) { return a; };
Run Code Online (Sandbox Code Playgroud)

我没有找到一种方法可以在clang-format附带的LLVM 8. 我发现的最接近的配置如下

clang-format -style={BasedOnStyle: WebKit, AllowShortFunctionsOnASingleLine: true,  AllowShortBlocksOnASingleLine: true}
Run Code Online (Sandbox Code Playgroud)

不管怎样,它没有达到你的全部要求,这就是它在我的 Windows 笔记本电脑上的样子:

void f() {
  func([this] { return false; },
       this);                           // ok
  func(this, [this] { return false; }); // ok
  func([this] { return false; });       // ok
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:“AllowShortLambdasOnASingleLine”甚至在“clang-format 9.0.0”中也可用 (3认同)
  • 是的,这不是一个解决方案。问题实际上是如上所述的 clang-format 中的错误。 (3认同)
  • 这个答案根本没有解决问题,不应该被授予赏金。 (3认同)
  • 我的问题的主要问题是使用 lambda 作为函数的中间参数。我在您的代码中没有看到有关此类情况的任何示例。 (2认同)