Приведите обобщенные элементы очереди c и обработайте события, используя производные классы - PullRequest
0 голосов
/ 17 марта 2020

У меня есть основной поток, который выполняет некоторую работу, и он асинхронно делегирует другой поток, чтобы отправить некоторые данные другому процессу.

Я использовал обобщенную c очередь shared_ptr (T), основного потока вставляет в очередь, и второй поток извлекает данные и обрабатывает их.

Я помещаю много типов данных (то есть shared_ptr (A), shared_ptr (B)), происходящих из T.

class A : public T{};
class B : public T{};

Какой лучший (эффективный) способ узнать производный класс от типа generi c.

PS: приведение Dynami c - не лучшее решение. Производитель отправляет тип данных. Потребитель выталкивает очередь и выполняет свою работу в зависимости от переданных данных. Потребитель использует эти данные при вызове данной функции. Потребитель должен определить производный класс переданного параметра, чтобы делегировать соответствующую функцию для вызова.

void process(shared_ptr<T> ptr)
{
if (type(ptr) == A) do work using A..
if (type(ptr) == B) do staff using B..
...
}

Спасибо за вашу помощь и время.

1 Ответ

0 голосов
/ 17 марта 2020

В качестве альтернативы очередям std::shared_ptr<T> вы можете ставить в очередь экземпляры вызываемого типа, такие как std::function<void()>.

#include <functional>

using task_type = std::function<void()>;

queue_type<task_type> queue;

Вы заявляете, что хотите что-то сделать как ...

if (type(ptr) == A) do work using A..
if (type(ptr) == B) do staff using B..

Если предположить, что две рассматриваемые функции do_work и do_stuff, тогда клиентский код будет ...

auto dataA = std::make_shared<A>(...);
queue.enqueue([dataA]()
              {
                  do_work(dataA);
              });
auto dataB = std::make_shared<B>(...);
queue.enqueue([dataB]()
              {
                  do_stuff(dataB);
              });

И потребительский код ...

while (true) {
    try {

        /*
         * Dequeue the next task.
         */
        auto f = queue.dequeue();

        /*
         * Run it.
         */
        f();
    catch (...) {

        /*
         * Handle errors here.
         */
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...