我有以下课程结构:
现在,我有了一个Device
指针,在这里我知道它的类型是WiredHeadphone
或RadioHeadphone
。我需要将此指针转换为HeadphoneInterface
。
在理想的世界中,我只会使用dynamic_cast。不幸的是,我在一个完全不支持dynamic_cast的嵌入式平台上。目前,我这样做:
HeadphoneInterface *GetDeviceAsHeadphone(Device* dev) {
// use my own type system to identify the actual type and cast accordingly:
if(dev->GetType() == Type_WiredHeadphone) {
return static_cast<HeadphoneInterface*>((WiredHeadphone *)dev);
} else if(dev->GetType() == Type_RadioHeadphone) {
return static_cast<HeadphoneInterface*>((RadioHeadphone *)dev);
} else {
return NULL;
}
}
这是丑陋的,无法维护。将来会有更多的耳机设备,我不想每次都更新此功能。
有没有更好的方法来解决这个问题?
最佳答案
您可以在Device
界面中添加一个虚拟函数,该函数可以为您(交叉)转换为HeadphoneInterface
:
struct HeadphoneInterface;
struct Device {
// ...
virtual HeadphoneInterface* getHeadphoneInterface() noexcept { return 0; }
// ...
};
并覆盖
WiredHeadphone
和RadioHeadphone
中的函数以返回指向HeadphoneInterface
的非空指针:struct WiredHeadphone : WiredDevice, HeadphoneInterface {
HeadphoneInterface* getHeadphoneInterface() noexcept override { return this; }
};
然后
GetDeviceAsHeadphone
变为:inline HeadphoneInterface* GetDeviceAsHeadphone(Device* dev) noexcept {
return dev->getHeadphoneInterface();
}
请注意,此处不需要显式强制转换。
关于c++ - 带有不相关类的static_cast,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53427533/