Приведение смарт-указателей без RTTI C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Приведение смарт-указателей без RTTI C++

Сообщение 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())
{

}
}
}



Подробнее здесь: https://stackoverflow.com/questions/785 ... out-rtti-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Приведение указателей функций в C++
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Почему приведение указателей к `void*` уменьшает размер двоичного файла?
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Почему приведение указателей к `void*` уменьшает размер двоичного файла?
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Приведение указателей к порядку байтов
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как получить счетчик оферента смарт-контракта с помощью C#
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»