带有不相关类的static_cast

时间:2018-11-22 09:21:26

标签: c++ casting static-cast

我具有以下课程结构:

enter image description here

现在我有一个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;
    }
}

这很丑陋,无法维护。将来会有更多的耳机设备,我不想每次都更新此功能。 有解决这个问题的更好方法吗?

1 个答案:

答案 0 :(得分:3)

您可以将虚拟函数添加到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();
}

请注意,此处不需要显式强制转换。