C++基于输入参数的动态代码生成

C++ dynamic code generation based on input parameter

本文关键字:参数 动态 代码生成 输入 于输入 C++      更新时间:2023-10-16

我有以下函数:

void scan(DataRow& input) {
if(input.isRaw()) {
...
}
if(input.isExternal()) {
...
}
if(input.hasMultipleFields()) {
...
for(auto& field: input.fields()) {
if(field.size() == 2) {
...
}
}
}
}

DataRow类有许多子类,上面的所有is函数都是虚拟的。

此函数用于扫描多个大型数据行组。对于每个组,所有数据行实例都将具有相同的属性(例如,所有原始,所有外部(。

因此,我不是在scan函数中使用所有这些 if/else 逻辑,而是在考虑是否有办法生成临时代码。例如,现在我已经知道我的下一组都是原始的(或全部不是(,那么我可以摆脱第一个 if 分支。

在Java中,我曾经通过为类生成字节代码并在JVM中动态加载生成的类来做这种事情。我知道同样的技巧对C++不起作用,但我几乎没有经验如何做到这一点。谁能给出一些提示?谢谢!

您无法在运行时轻松操作可执行代码。但是你的问题看起来不像你必须沿着那条路走下去。

您有具有相似属性的行组,并且每个组都有特殊的处理逻辑。此外,似乎有少量固定数量的不同类型的组。

您拥有在编译时拆分代码的所有必要信息 - 实际上是"编程时间"。将scan()函数拆分为一种组的一个函数,并相应地调用scan_raw()scan_external()等。

这会将if条件检查的次数从每行一次减少到每组一次。作为额外的好处,单独的扫描函数可以使用适当的派生类作为其参数类型,您可以摆脱整个isSomething()机器。

嗯,在这一点上,我很想指出你std::variantstd::visit(或他们的 Boost 等价物(。不过,这可能是一个更大的重构。因为在使用它们时,理想情况下,您会将它们用作当前基于继承的多态性方法的完全替代品。