将 clang-format 与 c++20 概念一起使用

Posted

技术标签:

【中文标题】将 clang-format 与 c++20 概念一起使用【英文标题】:Using clang-format with c++20 concepts 【发布时间】:2020-09-24 21:20:35 【问题描述】:

我查看了 clang-format 样式选项https://clang.llvm.org/docs/ClangFormatStyleOptions.html,但没有看到对 c++ 概念和要求子句的任何引用。通常我可以配置 clang-format 来做我想做的事,但我不知道如何让它很好地处理我的概念和需要子句:

    目前 clang-format 对我的概念是这样的:
template <typename F, typename P, typename T>
concept Accumulate_Fn = Parser<P>&& std::invocable<F, T, parser_t<P>>&&
    std::same_as<T, std::invoke_result_t<F, T, parser_t<P>>>;

但我想将每个约束放在自己的一行上(就像它对过长的函数参数所做的那样),以便结果如下所示:

template <typename F, typename P, typename T>
concept Accumulate_Fn = Parser<P> &&
                        std::invocable<F, T, parser_t<P>> &&
                        std::same_as<T, std::invoke_result_t<F, T, parser_t<P>>>;
    对于带有 requires 子句的函数,clang-format 目前给了我:
template <Parser P1, Parser P2, typename T, Accumulate_Fn<P1, parser_t<P1>> F>
requires std::same_as<T, parser_t<P1>> constexpr Parser auto
separated_by(P1&& p1, P2&& p2, T&& init, F&& f)

但我想要更接近:

template <Parser P1, Parser P2, typename T, Accumulate_Fn<P1, parser_t<P1>> F>
requires std::same_as<T, parser_t<P1>> 
constexpr Parser auto separated_by(P1&& p1, P2&& p2, T&& init, F&& f)

是否有任何神奇的选项可以实现这一点?我目前使用的是 clang-format 10.0。

【问题讨论】:

clang-format 仅允许包含现有编码标准中使用的规则。由于现在每个人都使用 clang 格式,因此存在先有鸡还是先有蛋的问题。出于同样的原因,例如无法以受控方式格式化 if-with-initializer(我在这里问过这个问题***.com/questions/67697966/…)。 【参考方案1】:

截至 20 年 7 月,clang-format 不正确支持概念。 LLVM 跟踪器中有一个open issue。

【讨论】:

感谢您链接到该问题。我会一直关注的。 我想知道什么时候会支持概念。

以上是关于将 clang-format 与 c++20 概念一起使用的主要内容,如果未能解决你的问题,请参考以下文章

QtCreator:将 QtCreatorCodeStyle 与 clang-format 统一起来

clang-format 打破 lint 注释

clang-format 如何忽略外部 C?

如何在 Ubuntu 中安装 clang-format?

Xcode 中配置 clang-format 格式化 C++ 代码

防止 clang-format 将多行 if 语句折叠成一行