C++中的通用容器

Ben*_*rst 10 c++ stl generic-collections

我正在尝试创建一个通用容器类型来提供单个公共接口,以及隐藏我正在使用的内部容器,因为它们可能会发生变化.

基本上我有插件返回项目集合,我不希望插件知道我的代码使用的容器类型.

任何人都能指出我比下面的示例代码更好的方向吗?

template<class C, typename I>
class Container
{
 public:
 //...

    void push(const I& item)
    {
        if(typeid(C) == typeid(std::priority_queue<I>))
        {
           std::priority_queue<I>* container = (std::priority_queue<I>*)&_container;
           container->push(item);
        }
        if(typeid(C) == typeid(std::list<I>))
        {
           std::list<I>* container = (std::list<I>*)&_container;
           container->push_back(item);
        }
        else
        {
           //error!
        }
     };

  private:
     C _container;
 //...
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Jam*_*lis 7

我有插件返回项目集合,我不希望插件知道我的代码使用的容器类型.

让你的插件提供beginend迭代器到他们的项目集合中,然后根据你的需要使用范围.

迭代器的最大优点是它们允许完全解耦数据的存储方式(容器)与数据的使用方式(算法;在您的情况下,是消耗插件数据的应用程序代码).

这样,您就不必关心插件如何存储他们的数据,并且插件一旦提供给您,就不必关心您对数据的处理方式.

  • @user:我不明白; 迭代器接口没有比容器接口更多的并发问题:要么在迭代它时锁定容器,要么制作容器的副本以进行迭代. (2认同)
  • @BretKuhns:我认为STL迭代器是鸭型的这一事实不是问题所在.假设你在文件范围定义`vector <int> x;`,后面的函数引用`x.begin()`或`x.end()`:如果函数("consumer")需要重新编译```的定义改为`list <int> x;`.通常这不是什么大问题 - *除非*你正在构建一个需要消耗(迭代)尚未知的容器类型的插件系统.在我的评论中,我一直在寻找一种避免在这种情况下重新编译消费者的方法. (2认同)