如何使用clang-format格式化地图初始化?

时间:2019-12-08 10:23:00

标签: c++ clang-format

我试图在一个相当大的C ++项目中引入clang格式。除少数情况外,一切都很好。最烦人的是地图初始化的格式化结果。我试图通过clang格式查找有关clang格式的标志或任何解决方案的信息,但是我什么都没找到。有问题的代码段:

System.out.println("1. Enter Student ID: ");
numID = sc.nextInt();
sc.nextLine();
Set<Integer> ids = new HashSet<>();
while (!ids.add(numID)) { // add returns false if numID is already in the Set
    System.out.println("The Student ID: " +numID+ " already exist.\nEnter New Student ID: ");
    numID = sc.nextInt();
    sc.nextLine();
}
...

我的// before formatting const std::map<std::type_index, void *> functionMap{ {typeid(DummyClassAAAAA), (bool (*)(const DummyClassAAAAA &, const DummyClassAAAAA &)) &operator== }, {typeid(DummyClassBBBB), (bool (*)(const DummyClassBBBB &, const DummyClassBBBB &)) &operator== }, {typeid(DummyClassCCC), (bool (*)(const DummyClassCCC &, const DummyClassCCC &)) &operator== }, {typeid(DummyClassDDDDDDDDD), (bool (*)(const DummyClassDDDDDDDDD &, const DummyClassDDDDDDDDD &)) &operator== }, {typeid(DummyClassEEEEEEE), (bool (*)(const DummyClassEEEEEEE &, const DummyClassEEEEEEE &)) &operator== }, {typeid(DummyClassFFFFFFFFFF), (bool (*)(const DummyClassFFFFFFFFFF &, const DummyClassFFFFFFFFFF &)) &operator== } }; // after formatting const auto functionMap = std::map<std::type_index, void *>{{typeid(DummyClassAAAAA), (bool (*)(const DummyClassAAAAA &, const DummyClassAAAAA &)) &operator== }, {typeid(DummyClassBBBB), (bool (*)(const DummyClassBBBB &, const DummyClassBBBB &)) &operator== }, {typeid(DummyClassCCC), (bool (*)(const DummyClassCCC &, const DummyClassCCC &)) &operator== }, {typeid(DummyClassDDDDDDDDD), (bool (*)(const DummyClassDDDDDDDDD &, const DummyClassDDDDDDDDD &)) &operator== }, {typeid(DummyClassEEEEEEE), (bool (*)(const DummyClassEEEEEEE &, const DummyClassEEEEEEE &)) &operator== }, {typeid(DummyClassFFFFFFFFFF), (bool (*)(const DummyClassFFFFFFFFFF &, const DummyClassFFFFFFFFFF &)) &operator== } }; 文件:

.clang-format

我在Windows上使用UseTab: Never IndentWidth: 2 BreakBeforeBraces: Allman AllowShortIfStatementsOnASingleLine: true AllowShortLoopsOnASingleLine: true AllowShortFunctionsOnASingleLine: false ColumnLimit: 120 ContinuationIndentWidth: 2 ConstructorInitializerIndentWidth: 2 PointerAlignment: Right DerivePointerAlignment: false AlignAfterOpenBracket: DontAlign AllowShortBlocksOnASingleLine: false SpaceAfterTemplateKeyword: false AlwaysBreakTemplateDeclarations: Yes AlignTrailingComments: true IndentCaseLabels: true BreakBeforeBinaryOperators: NonAssignment AllowAllParametersOfDeclarationOnNextLine: false

此处唯一的要求是,初始化列表中的每一对都应从新行开始,但应在同一列中。我不想为任何代码段都关闭clang格式,所以我真的很想通过配置clang-format来产生正确的输出来解决它。

任何想法,如何解决?也许如果没有办法实现这一目标,那么有人可以提供任何证明吗?

1 个答案:

答案 0 :(得分:1)

我无法告诉您为什么clang-format在这种情况下会以这种方式进行格式化,以及是否应将其视为错误。

但是在这种情况下,花括号可以帮助解决格式问题,因为它会更改AST并因此更改所应用的规则以及用作对齐参考的内容。

在值部分周围添加大括号将纠正地图项的对齐方式:

{typeid(DummyClassAAAAA),
       ((bool (*)(const DummyClassAAAAA &, const DummyClassAAAAA &)) &
        operator==)}

根据您希望在完整列表中获得的整体对齐方式,您需要在最后一项之后添加一个逗号,例如强制};换行。