我有以下课程结构:

c++ - 带有不相关类的static_cast-LMLPHP

现在,我有了一个Device指针,在这里我知道它的类型是WiredHeadphoneRadioHeadphone。我需要将此指针转换为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; }
// ...
};


并覆盖WiredHeadphoneRadioHeadphone中的函数以返回指向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/

10-13 05:53