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

问题描述 投票:0回答:1

我具有以下功能:

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 ++,但是我几乎没有经验。任何人都可以给点提示吗?谢谢!

c++ code-generation
1个回答
1
投票

您无法在运行时轻松地操纵可执行代码。但是您的问题看起来并不一定要走那条路。

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

您具有在编译时拆分代码的所有必要信息,实际上是“编程时”。为每种组将scan()功能拆分为一个功能,然后分别调用scan_raw()scan_external()等。

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

嗯,在这一点上,我很想将您引向std::variantstd::visit(或它们的Boost等效项)。但是,那可能是一个更大的重构。因为使用它们时,最好将它们用作当前基于继承的多态方法的完整替代。

© www.soinside.com 2019 - 2024. All rights reserved.