具有不同容器类型的std :: queue取决于运行时数据

时间:2016-02-05 17:40:39

标签: c++ boost stl

我有一个类需要使用std :: queue作为实例var来存储一些数据。我的问题是std :: queue默认使用std :: deque作为容器类型,或者需要在编译时提供另一个容器类型。但是我想使用哪个容器取决于类用户的一些运行时数据,因此我无法在编译时指定它。在对std :: queue进行实例化并提供正确的容器实现后,我不再关心容器本身,而只使用std :: queue的接口。

我想提供的容器是std :: deque或boost :: circular_buffer,它们都存储相同类型的元素,只有当调用者想要存储无限量的数据时才使用它们如果没有,则循环_缓冲。

我到目前为止找到的唯一方法是一个自定义抽象基类,它作为通用接口,为不同的std :: queue实例提供两个派生实现。但在这种情况下,我必须复制std :: queue的接口,这真的很烦人。

有没有办法以这种方式声明和实例化std :: queue?类似" std :: queue with unknown / runtime提供容器"。

2 个答案:

答案 0 :(得分:1)

模板参数必须在编译类型中已知。您无法在运行时更改queue的基础容器。您可以做的是某种包装器或联合,它将两种类型的队列组合在一起,然后在运行时使用一种或另一种,具体取决于运行时条件。

答案 1 :(得分:1)

如果您不希望有很多该类的实例,那么一个非常低技术,简单但最终工作的方法是简单地向您的班级添加两个不同的成员变量:std::queue<T> a std::queue<T, boost::circular_buffer<T>>。然后在实例化类时在运行时选择适当的容器。

每个类的实例会花费你额外的几个字节,因为每个实例中都会有一个未使用的空容器,但同时也可以避免您在工会中遇到的任何困难或过于复杂的代码,{ {1}},boost::variant或类似的事情。

这是一个完整的例子:

void*