如何为索引指定不具有复制构造函数的对象

时间:2016-01-29 12:03:32

标签: c++ copy-constructor stdmap

我在这里使用并发队列:

https://github.com/cameron314/readerwriterqueue

基本上有一个制作人,它为多个消费者制作数据。 每个消费者都应该拥有自己的队列,每个消费者都有一个唯一的标识符。

理想情况下,我想将队列添加到std :: map并将唯一标识符映射到队列。

不幸的是,这并不起作用,因为队列实现没有复制构造函数,因此拒绝将其添加到地图中。

如何将唯一ID映射到队列?

1 个答案:

答案 0 :(得分:3)

潜在的问题是队列不允许复制或移动在这种情况下,解决方案是使用std::unique_ptr,这可以为您提供一个非常安全的解决方案来创建这些对象。堆。关键是这种类型只能移动而不能复制。

根据您的说明,我认为您想创建std::map<unsigned int, std::unique_ptr<ReaderWriterQueue<T>>>

class SomeClass
{
   public:
   void setUpQueue(unsigned int new_id)
   {
      std::unique_ptr<ReaderWriterQueue<T>> ptr(new ReaderWriterQueue<T>(...)); 
      // Have to use move here, othrewise, it would attempt to make a copy
      queue_map.emplace(new_id, std::move(ptr));    
      // could also do
      // queue_map.insert({new_id, std::move(ptr)}; or
      // queue_map.insert(std::make_pair(new_id, std::move(ptr));
   }

   std::map<unsigned int, std::unique_ptr<ReaderWriterQueue<T>>> queue_map;
}