重构/替换强制转换的工具或方法的任何建议,例如:
(type*) data
进入:
convert_to_type(data)
data
当其中有更高优先级的运算符、括号或换行符时,事情变得更加棘手:
(type*) a(b)->
c
应该变成convert_to_type(a(b)->c)
不等convert_to_type(a)(b)->c
重构/替换强制转换的工具或方法的任何建议,例如:
(type*) data
进入:
convert_to_type(data)
data
当其中有更高优先级的运算符、括号或换行符时,事情变得更加棘手:
(type*) a(b)->
c
应该变成convert_to_type(a(b)->c)
不等convert_to_type(a)(b)->c
我不知道能够正确解析和自动替换这些的工具。
我知道的最好的选择是使用 g++,-Wold-style-cast
它会帮助你警告所有这样的 C 风格的转换,允许你通过分析有问题的代码来正确地配置它们。这显然会比工具花费更多的时间,但它也让您有机会审查并防止工具进行不正确的转换。
在这种情况下,您将需要一个语义感知的 C++ 解析器。没有那么多工具。
实际上,我唯一能想到的就是 Clang。使用它的 AST 匹配器,您可以编写一个程序来检索对应于 C 样式转换的 AST 节点,然后发出文本替换。因为 Clang 的 AST 是完全语义感知的,所以您可以访问正在转换的表达式、它的类型以及它被转换为的类型。
工具或额外部分中有示例,例如,您可以查看Cpp11Migrate工具以进行匹配和替换。
注意:如果你走这条路,你会想熟悉Clang 的 AST 。
重构/替换强制转换的工具或方法的任何建议,例如:
应该没有。这个问题很棘手,当创建 C++ 类型转换(static_cast、cost_cast 等)时,它们的明确目标之一是“使用自动化工具在代码中应该很容易找到它们。
在某些情况下,在确定一对括号是否用于算术运算(用于运算符优先级的括号)、强制转换或其他内容之前,工具需要进行完整解析。
你最好一个一个地改变它们(这样你会引入更少的错误)。
如果您的代码库很大,您也可以从为此目的编写自己的工具中受益(gcc 对此有警告,因此它们应该很容易找到)。
有点认为这会在某个时候在你的脸上爆炸,但是:
template<typename T> T myFunc()
{
// do stuff
return (T) retVal;
}