Я пытаюсь управлять устройствами на встроенном устройстве. Устройства управляются диспетчером устройств. В его обязанности входит обеспечение срока службы устройств и снабжение устройствами других частей кода.
У устройства есть определенные методы (инициализация, проверка статуса и т. д.). Для простоты я добавлен только IsReady(). Чтобы сделать код более гибким, мне нравится использовать интерфейсы. Например, у меня есть расширитель ввода-вывода с поддержкой UART. Таким образом, это устройство реализует IDevice, но также и интерфейс IStream.
Я могу запросить все устройства, совместимые с IStream. Поскольку я не хочу полагаться на RTTI, я использую для этого ключи. (В примере они жестко запрограммированы). Я бы предпочел, чтобы это не требовалось, но без RTTI я этого не вижу.
Проблема возникает, когда я пытаюсь получить устройства с определенный интерфейс. Поскольку сам этот интерфейс не наследуется от IDevice, у меня нет доступа к методам IDevice.
Вот мой вопрос: у меня есть объект, то есть std::shared_ptr, теперь я хотел бы получить доступ к методам, определенным IDevice. Поскольку IStream не реализует IDevice, я не могу получить доступ к этим методам. По той же причине я не могу использовать статическое приведение, а поскольку у меня нет RTTI, я не могу использовать динамическое приведение.
Одно решение, которое только что пришло мне в голову, использует диспетчер устройств для получения IDevice из IStream.
Вот урезанная версия того, чего я пытаюсь достичь:
class IDevice {
public:
virtual bool IsReady() = 0;
};
class IStream {
public:
virtual size_t ReadStream(uint8_t* buffer, size_t bufferSize) = 0;
};
class DeviceManager {
public:
template
std::vector GetDevicesByCompatibility(const std::string& compatibility);
};
class MAX14830_Uart : public IDevice, public IStream {
public:
bool IsReady() override;
size_t ReadStream(uint8_t* buffer, size_t bufferSize) override;
};
void Test()
{
DeviceManager deviceManager; // Not included in example, but the devices are instantiated and registered to the device manager
auto devices = deviceManager.GetDevicesByCompatibility("IStream");
for (auto& device: devices)
{
// Here is the problem, I want to check if the device is ready, but my device is of type IStream, not IDevice
if (device->IsReady())
{
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... out-rtti-c
Приведение смарт-указателей без RTTI C++ ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение