基于输入参数的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::variant
和 std::visit
(或它们的 Boost 等价物)。不过,这可能是一个更大的重构。因为在使用它们时,您最好将它们用作当前基于继承的多态性方法的完全替代。
我有以下功能:
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::variant
和 std::visit
(或它们的 Boost 等价物)。不过,这可能是一个更大的重构。因为在使用它们时,您最好将它们用作当前基于继承的多态性方法的完全替代。