首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将指向方法的指针从派生类转换为基类的最佳方法

将指向方法的指针从派生类转换为基类的最佳方法
EN

Stack Overflow用户
提问于 2019-05-23 23:59:13
回答 1查看 58关注 0票数 2

我们有一个基类ByteCode,这个基类是泛型的。ByteCode的子级需要编写以下形式的方法:

代码语言:javascript
运行
复制
void m();

ByteCode类应该有一个方法定义:

代码语言:javascript
运行
复制
typedef void (ByteCode::*Method)();

为了执行字节码,我们需要:

代码语言:javascript
运行
复制
void exec() {
  while (true) {
    uint16_t opcode = getOpcode();
    Method m = opcodes[opcode];
    this->*m();
  }
}

在一个类中做这件事是没有问题的。但是我们在基类中有泛型代码,派生类有数组:

代码语言:javascript
运行
复制
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
}

问题是这些方法不是基类,它们是派生的。但我们唯一的实例是派生的,我们不想产生虚拟的开销,我们只想强制转换并使其工作,但编译器正在捕捉每一个技巧。如果它相信我们的话:

代码语言:javascript
运行
复制
Method MyByteCodeEngine ::opcodes[65536] = {
  (Method)MyByteCodeEngine::m1,
  (Method)MyByteCodeEngine::m2,
  (Method)MyByteCodeEngine::m3
}

我们可以通过删除ByteCode类来解决这个问题,但这会迫使我们在有字节码解释器的任何时候重复代码。对于如何欺骗C++干净利落地接受这个问题,有什么建议吗?

EN

Stack Overflow用户

回答已采纳

发布于 2019-05-24 00:14:40

您可以使用Curiously recurring template pattern,以便基类知道成员函数的类型。

代码语言:javascript
运行
复制
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
}
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56279030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档