如何使用 clang 格式格式化地图初始化?
How to format a map initialization with clang-format?
我正在尝试在一个相当大的C++项目中引入 clang 格式。除了少数情况外,进展顺利。最烦人的是地图初始化的格式化结果。我试图通过谷歌搜索找到有关 clang 格式的标志或任何解决方案,但我什么也没找到。有问题的代码片段:
// 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
文件:
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
我在Windows上使用clang-format version 9.0.0 (tags/RELEASE_900/final)
。
这里唯一的要求是初始化列表中的每个对都应该从新行开始,但在同一列中。我不想关闭任何代码片段的 clang 格式,所以我真的很想通过配置 clang 格式来产生正确的输出来解决它。
任何想法,如何解决这个问题?也许如果没有办法做到这一点,那么有人可以提供任何证据吗?
编辑 - 解决方案
添加其他大括号后,结果如下所示:
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==)},
};
我无法告诉您为什么在这种情况下clang-format
以这种方式进行格式化,以及是否应该将其视为错误。
但在这种情况下,大括号可以帮助解决格式问题,因为它会更改 AST,从而更改应用的规则,以及用作对齐参考的内容。
在值部分周围添加大括号将更正地图项目的对齐方式:
{typeid(DummyClassAAAAA),
((bool (*)(const DummyClassAAAAA &, const DummyClassAAAAA &)) &
operator==)}
根据您希望在完整列表中具有的整体对齐方式,您需要在最后一项之后添加一个逗号,例如强制};
到新行。
相关文章:
- 如何使用 clang 格式格式化地图初始化?
- 如何使用迭代器初始化地图的键字段?
- 将空初始化器列表分配给现有向量或地图的效果
- 您应该如何在OpenGL 4.5中初始化立方体地图阵列
- 我将如何初始化C 中的一系列地图
- 使用聚合初始化时,是否可以将无拷贝置换到地图中
- 大型地图的静态初始化
- 单独的地图声明和初始化
- 有没有办法检查地图是否已在 C++98 中初始化
- 初始化地图时出错
- 初始化静态地图,不知道密钥
- 优化地图上的初始化:转发密钥
- 在 C++ 中预初始化地图
- C++地图反演初始化
- C++11 初始化地图
- 初始化 1000 个地图元素
- 在VS 2013中使用初始值设定项列表初始化地图的地图
- C++地图<K,T>初始化
- 初始化地图<字符串、矢量<string>>
- 二维静态地图的初始化