如何将std :: unique_ptr用于std :: list变量

时间:2014-01-30 16:15:05

标签: c++11 unique-ptr

我有一个消费者 - 生产者的情况,我不断将数据推送到列表中,如果它不存在,那么我每隔几秒就打包并将数据发送到服务器。

目前我有一个延迟了几秒钟的线程,唤醒,设置一个标志,以便没有任何内容添加到列表中,打包,删除从列表中处理的项目,然后允许程序启动再次添加到列表中。

对于原型来说这很好,但现在我需要让它在更现实的情况下更好地工作。

所以,我想让生产者获取信息,当大小足够大或足够的时间过去时,将列表传递给要处理的线程。

我想将引用传递给列表,而unique_ptr将是有益的,因此一旦移动它,生产者线程就可以创建一个新列表,并且出于所有实际目的,使用与之前相同的列表。

但是当我试图从

更改我的列表时
typedef list<string> STRINGQUEUE;
STRINGQUEUE newMachineQueue;

std::unique_ptr<STRINGQUEUE> newMachineQueue;

然后我收到insert不是std::unique_ptr成员的错误。

我认为我不想使用newMachineQueue.get()然后执行我的操作,因为我认为我失去了unique_ptr的好处。

那么,如何在列表中使用unique_ptr并能够调用列表中的方法?

1 个答案:

答案 0 :(得分:2)

就像使用指针一样使用它。

newMachineQueue->insert(...);

您可能会对in the documentation感兴趣。

您也不需要使用unique_ptr,但您可以移动列表并重新分配新列表。

void consumer(std::list<string> list) {
  // accept by value!
}

std::list<string> machineQueue;
// hand-off to consumer
consumer(std::move(machineQueue));
machineQueue = std::list<string>{}; // new list