非模板化容器,可以容纳任何东西

时间:2011-08-08 17:30:24

标签: c++ stl

我有一个用于处理线程的小框架。主要部分是一个对象,它基本上是一个互斥控制std::queue,一个线程推入,另一个线程弹出。

此类无法模板化,因为对象类型可在一次运行中变化。目前,我创建了一个哑课:

class Object {
public:
    Object(){}
    virtual ~Object(){}
};

通过此类从线程流向线程的任何对象都必须从Object继承,因为它是std::queue所持有的。这很好用,但我想必须有一个更好的方法,因为这种方法需要继承和许多调用dynamic_cast。有什么想法吗?

编辑在这种情况下,指针也是智能指针,因此类型信息对于维护非常重要。

4 个答案:

答案 0 :(得分:6)

使用std :: queue< boost::any>。它将保存任何类型的对象。

要获得该对象,您必须使用boost本身提供的特殊强制转换功能:

答案 1 :(得分:1)

在容器中使用void*作为“指向未知类型的指针”(如果对象是不可变的,则为const void*)。它仍然需要转换(因此来自其他一些通道的类型信息),但如果你想避免模板和继承,你真的没有任何其他选择。

答案 2 :(得分:1)

如果您想要更加类型安全,可能需要查看boost::any

答案 3 :(得分:1)

问题是类型如何变化。你当然要有一些 对容器内容的限制。为什么放置物体 进入容器?基于此,你应该能够设计出来 合理的抽象基类,它允许虚函数 用于调度,而不是来自人工 没有界面的Object。 (取决于容器的用途 是的,访客模式的某些变体可能是必要的。因此,为 例如,消息队列可能包含虚函数 processMessage( Base* ),其具体实现除了 调用Base的不同成员函数。)