我具有以下功能:
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::variant
和std::visit
(或它们的Boost等效项)。但是,那可能是一个更大的重构。因为使用它们时,最好将它们用作当前基于继承的多态方法的完整替代。