C++ 使用派生类强制转换通用队列元素和进程事件
我有一个主线程做一些工作,它异步地委托另一个线程向另一个进程发送一些数据 我使用了一个通用的shared_ptr(T)队列,主线程推入队列,第二个线程弹出数据并处理它 I推送从T派生的许多数据类型(即共享的ptr(A)、共享的ptr(B))C++ 使用派生类强制转换通用队列元素和进程事件,c++,multithreading,queue,C++,Multithreading,Queue,我有一个主线程做一些工作,它异步地委托另一个线程向另一个进程发送一些数据 我使用了一个通用的shared_ptr(T)队列,主线程推入队列,第二个线程弹出数据并处理它 I推送从T派生的许多数据类型(即共享的ptr(A)、共享的ptr(B)) class A : public T{}; class B : public T{}; 从泛型类型中了解派生类的最佳方法(有效)是什么 PS:动态强制转换不是最好的解决方案。 生产者发送数据类型。 使用者弹出队列并根据传递的数据执行其工作。 使用者在调用给
class A : public T{};
class B : public T{};
从泛型类型中了解派生类的最佳方法(有效)是什么
PS:动态强制转换不是最好的解决方案。
生产者发送数据类型。
使用者弹出队列并根据传递的数据执行其工作。
使用者在调用给定函数时使用此数据。
使用者应检测所传递参数的派生类,以委托适当的函数调用
void process(shared_ptr<T> ptr)
{
if (type(ptr) == A) do work using A..
if (type(ptr) == B) do staff using B..
...
}
void流程(共享)
{
如果(类型(ptr)=A)使用..进行工作。。
如果(类型(ptr)=B)员工使用B。。
...
}
感谢您的帮助和时间。作为对
std::shared\u ptr
的实例进行排队的替代方法,您可以对可调用类型的实例进行排队,例如
假设所讨论的两个函数是dou-work
和dou-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);
});
离题,但。。。为什么事情会这样?为什么不只拥有一个
std::function
实例队列?客户机代码将任务推送到队列中,消费者只需退出队列并调用它们。感谢您的回复,我有数据要从一个线程传递到另一个线程。并且,可以通过用于初始化std::function
的,我不明白你在说什么。我想用参数数据运行methode f()。然后请编辑你的问题,以澄清你想做什么,以及这些额外参数来自何处。如果消费者执行f(),它将调用do_work(dataA),例如?这是正确的。要调用的函数和要作为参数传递的数据都可以使用lambda打包。
if (type(ptr) == A) do work using A..
if (type(ptr) == B) do staff using B..
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.
*/
}
}