Я пытаюсь управлять устройствами на встроенном устройстве. Устройства управляются диспетчером устройств. В его обязанности входит обеспечение срока службы устройств и снабжение устройствами других частей кода.
У устройства есть определенные методы (инициализация, проверка статуса и т. д.). Для простоты я добавлен только 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++
Программы на C++. Форум разработчиков
1716453916
Anonymous
Я пытаюсь управлять устройствами на встроенном устройстве. Устройства управляются диспетчером устройств. В его обязанности входит обеспечение срока службы устройств и снабжение устройствами других частей кода.
У устройства есть определенные методы (инициализация, проверка статуса и т. д.). Для простоты я добавлен только 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())
{
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78521845/casting-smartpointers-without-rtti-c[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия