C ++:使用不同的返回类型模拟虚拟方法

时间:2016-03-07 20:44:33

标签: c++ class templates template-specialization virtual-method

我试图编写一个包含几个非常相似的虚方法的基类,我希望使用模板来减少重复:

class CPU {
    template<typename T>
    T getRegister(unsigned int which) {
        /** Returns value of specified register.
         */
        return *(T*)this->getRegisters()[which].data;
    };
    virtual  int16_t getRegister(unsigned int which);
    virtual uint16_t getRegister(unsigned int which);
    virtual  int32_t getRegister(unsigned int which);
    virtual uint32_t getRegister(unsigned int which);
    //etc...
};

class Z80: public CPU: { ... };
Z80 myCPU;
printf("Register 0 = 0x%04X\n", myCPU.getRegister<uint16_t>(0));

目标是让各个CPU能够定义自己的getRegister()或使用CPU基类中定义的那个。

如果可能的话,我还不确定正确的语法是什么?

与我发现的大部分答案不同的要点:

  • 班级本身不是模板
  • 方法是虚拟的

1 个答案:

答案 0 :(得分:1)

我去寻找副本,但找不到一个...我确定有一个,但我输入的内容都找不到一个。

C ++不允许具有相同签名[1]的两个具有不同返回类型的函数。编译器需要直接从函数签名中知道返回类型。

有几种不同的方法可以解决这个特殊情况:

1)声明不同的功能:

 virtual  int16_t getRegisterS16(unsigned int which);
 virtual uint16_t getRegisterU16(unsigned int which);
 virtual  int32_t getRegisterS32(unsigned int which);
 virtual uint32_t getRegisterU32(unsigned int which);

2)使用间接类型:

virtual void getRegister(unsigned int which, int16_t &value);
virtual void getRegisterU16(unsigned int which, uint16_t &value);
...

3)使用模板为CPU设置固定的寄存器大小:

template<typename T>
class CPU {
    T getRegister(unsigned int which) {
      ... 
    }
};

我还要在此注意,对于99%的CPU操作,有符号和无符号数学是相同的。它只是比较不同的操作[至少在合理的现代CPU中,你可以期望在现代的x86或ARM处理器上执行数学计算,而不是在简单的数学步骤中单独模拟每个位]

[1]签名是名称,参数类型和成员函数是否为const - 我认为可能还有一两件事,但那些是主要的。