C++:用不同的 return 类型模板化虚方法
C++: Templating a virtual method with different return types
我正在尝试编写一个基础class,其中包含几个非常相似的虚拟方法,我希望使用模板来减少重复:
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
基础 class 中定义的 getRegister()。
我不确定正确的语法是什么来完成这项工作,如果可能的话?
与我找到的大部分答案不同的要点:
- class本身不是模板
- 方法是虚拟的
我去寻找副本,但找不到...我确定有,但我输入的任何内容都找不到合适的。
C++ 不允许具有相同签名 [1] 的两个函数具有不同的 return 类型。编译器需要直接从函数签名中知道 return 类型。
有几种不同的方法可以解决这个特殊情况:
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) {
...
}
};
我还要在这里说明,对于 CPU 的 99% 的运算,有符号和无符号数学是相同的。仅比较不同的操作[至少在相当现代的 CPU 中,您可以期望在现代 x86 或 ARM 处理器上执行数学运算,而不是在简单的数学步骤中单独模拟每个位]
[1] 签名是名称、参数类型以及成员函数是否为 const
- 我认为可能还有一两件事,但这些是主要的。
我正在尝试编写一个基础class,其中包含几个非常相似的虚拟方法,我希望使用模板来减少重复:
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
基础 class 中定义的 getRegister()。
我不确定正确的语法是什么来完成这项工作,如果可能的话?
与我找到的大部分答案不同的要点:
- class本身不是模板
- 方法是虚拟的
我去寻找副本,但找不到...我确定有,但我输入的任何内容都找不到合适的。
C++ 不允许具有相同签名 [1] 的两个函数具有不同的 return 类型。编译器需要直接从函数签名中知道 return 类型。
有几种不同的方法可以解决这个特殊情况:
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) {
...
}
};
我还要在这里说明,对于 CPU 的 99% 的运算,有符号和无符号数学是相同的。仅比较不同的操作[至少在相当现代的 CPU 中,您可以期望在现代 x86 或 ARM 处理器上执行数学运算,而不是在简单的数学步骤中单独模拟每个位]
[1] 签名是名称、参数类型以及成员函数是否为 const
- 我认为可能还有一两件事,但这些是主要的。