我有一个用于处理线程的小框架。主要部分是一个对象,它基本上是一个互斥控制std::queue
,一个线程推入,另一个线程弹出。
此类无法模板化,因为对象类型可在一次运行中变化。目前,我创建了一个哑课:
class Object {
public:
Object(){}
virtual ~Object(){}
};
通过此类从线程流向线程的任何对象都必须从Object
继承,因为它是std::queue
所持有的。这很好用,但我想必须有一个更好的方法,因为这种方法需要继承和许多调用dynamic_cast
。有什么想法吗?
编辑在这种情况下,指针也是智能指针,因此类型信息对于维护非常重要。
答案 0 :(得分:6)
答案 1 :(得分:1)
在容器中使用void*
作为“指向未知类型的指针”(如果对象是不可变的,则为const void*
)。它仍然需要转换(因此来自其他一些通道的类型信息),但如果你想避免模板和继承,你真的没有任何其他选择。
答案 2 :(得分:1)
如果您想要更加类型安全,可能需要查看boost::any。
答案 3 :(得分:1)
问题是类型如何变化。你当然要有一些
对容器内容的限制。为什么放置物体
进入容器?基于此,你应该能够设计出来
合理的抽象基类,它允许虚函数
用于调度,而不是来自人工
没有界面的Object
。 (取决于容器的用途
是的,访客模式的某些变体可能是必要的。因此,为
例如,消息队列可能包含虚函数
processMessage( Base* )
,其具体实现除了
调用Base
的不同成员函数。)