【发布时间】:2019-05-23 15:59:13
【问题描述】:
我们有一个旨在通用的基类 ByteCode。 ByteCode 的子级应该编写如下形式的方法:
void m();
ByteCode 类应该有一个方法定义:
typedef void (ByteCode::*Method)();
为了执行字节码,我们有:
void exec() {
while (true) {
uint16_t opcode = getOpcode();
Method m = opcodes[opcode];
this->*m();
}
}
在一堂课上这样做是没有问题的。但是我们在基类中有泛型代码,而派生有数组:
class MyByteCodeEngine : public ByteCode {
private:
static Method opcodes[65536];
void m1() {}
void m2() {}
void m3() {}
};
Method MyByteCodeEngine ::opcodes[65536] = {
MyByteCodeEngine::m1,
MyByteCodeEngine::m2,
MyByteCodeEngine::m3
}
问题是这些方法不是基类,它们是派生的。但是我们唯一拥有的实例是派生的,我们不想招致虚拟的开销,我们只想强制转换并使其工作,但编译器正在捕捉每一个技巧。如果它只是信任我们:
Method MyByteCodeEngine ::opcodes[65536] = {
(Method)MyByteCodeEngine::m1,
(Method)MyByteCodeEngine::m2,
(Method)MyByteCodeEngine::m3
}
我们可以通过消除 ByteCode 类来解决这个问题,但这会迫使我们在任何有字节码解释器时重复代码。关于如何欺骗 C++ 干净地接受这一点的任何建议?
【问题讨论】:
-
我会使用
std::vector<std::function<void ()>>并使用捕获this的 lambdas 来初始化它们。
标签: c++ inheritance member-function-pointers pointer-to-member