将指针从派生到基类的方法的最佳方法



我们有一个旨在通用的基类字节码。比例的子女有望编写形式的方法:

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
}

我们可以通过消除字节码类来解决此问题,但是这迫使我们随时都有字节式解释器重复代码。关于如何愚弄C 接受此问题的任何建议?

您可以使用奇怪的重复模板模式,以便基类知道成员函数的类型。

template<class T>
struct ByteCode {
  typedef void (T::* Method)();
  void exec() {
    while (true) {
      uint16_t opcode = getOpcode();
      Method m = T::opcodes[opcode];
      static_cast<T*>(this)->*m();
    }
  }
};
class MyByteCodeEngine : public ByteCode<MyByteCodeEngine > {
  private:
    static Method opcodes[65536];
    void m1() {}
    void m2() {}
    void m3() {}
};
MyByteCodeEngine::Method MyByteCodeEngine ::opcodes[65536] = {
  &MyByteCodeEngine::m1,
  &MyByteCodeEngine::m2,
  &MyByteCodeEngine::m3
}

相关内容

  • 没有找到相关文章

最新更新