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

C++ dynamic code generation based on input parameter

我有以下功能:

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

}

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

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

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

在 Java 中,我曾经通过为 class 生成字节码并在 JVM 中动态加载生成的 class 来做这类事情。我知道同样的技巧对 C++ 不起作用,但我对如何做到这一点没有什么经验。任何人都可以给一些提示吗?谢谢!

您无法在运行时轻易地操作可执行代码。但你的问题看起来并不像你必须走那条路。

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

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

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

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