static_cast 与无关 类
static_cast with unrelated classes
我有以下 class 结构:
现在我有一个 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;
}
}
这太丑陋了,而且无法维护。以后Headphone设备会越来越多,不想每次都更新这个功能。
有没有更好的方法来解决这个问题?
您可以将虚函数添加到 Device
接口,为您执行(交叉)强制转换为 HeadphoneInterface
:
struct HeadphoneInterface;
struct Device {
// ...
virtual HeadphoneInterface* getHeadphoneInterface() noexcept { return 0; }
// ...
};
并将 WiredHeadphone
和 RadioHeadphone
中的函数覆盖为 return 指向 HeadphoneInterface
的非空指针:
struct WiredHeadphone : WiredDevice, HeadphoneInterface {
HeadphoneInterface* getHeadphoneInterface() noexcept override { return this; }
};
那么GetDeviceAsHeadphone
就变成了:
inline HeadphoneInterface* GetDeviceAsHeadphone(Device* dev) noexcept {
return dev->getHeadphoneInterface();
}
请注意,此处不需要显式转换。
我有以下 class 结构:
现在我有一个 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;
}
}
这太丑陋了,而且无法维护。以后Headphone设备会越来越多,不想每次都更新这个功能。 有没有更好的方法来解决这个问题?
您可以将虚函数添加到 Device
接口,为您执行(交叉)强制转换为 HeadphoneInterface
:
struct HeadphoneInterface;
struct Device {
// ...
virtual HeadphoneInterface* getHeadphoneInterface() noexcept { return 0; }
// ...
};
并将 WiredHeadphone
和 RadioHeadphone
中的函数覆盖为 return 指向 HeadphoneInterface
的非空指针:
struct WiredHeadphone : WiredDevice, HeadphoneInterface {
HeadphoneInterface* getHeadphoneInterface() noexcept override { return this; }
};
那么GetDeviceAsHeadphone
就变成了:
inline HeadphoneInterface* GetDeviceAsHeadphone(Device* dev) noexcept {
return dev->getHeadphoneInterface();
}
请注意,此处不需要显式转换。