如何将unique_ptr存储在队列中

Posted

技术标签:

【中文标题】如何将unique_ptr存储在队列中【英文标题】:How to store unique_ptr in a queue 【发布时间】:2015-01-06 06:11:01 【问题描述】:

我有这样一个代码,我尝试将std::unique_ptr<T> 存储在std::queue 中,但它不会编译

#include "stdafx.h"
#include <windows.h>
#include <memory>
#include <string>
#include <iostream>
#include <deque>

using namespace std;

class Foo 
    std::string _s;
public:
    Foo(const std::string &s)
        : _s(s)
    
        cout << "Foo - ctor";
    

    ~Foo() 
        cout << "Foo - dtor";
    

    void Say(const string &s) 
        cout << "I am " << _s << " and addtionaly " << s;
    
;

typedef std::pair<long, std::unique_ptr<Foo>> MyPairType;
typedef std::deque<MyPairType> MyQueueType;

void Func(const std::unique_ptr<Foo> &pf) 
    pf->Say("Func");


void AddToQueue(MyQueueType &q, std::unique_ptr<Foo> &pF)
    MyPairType p;
    ::GetSystemTimeAsFileTime((FILETIME*)&p.first);
    p.second = pF; // **Fails here**
    q.push_back(p);


int _tmain(int argc, _TCHAR* argv[])

    std::unique_ptr<Foo> pF(new Foo("Aliosa"));

    Func(pF);

    return 0;

它说我不能在 AddToQueue 方法中分配。我知道这可能与boost::shared_ptr 有关,但我们正试图摆脱boost 依赖,因此出现了这样的问题。

知道如何实现所需的行为吗? 谢谢

【问题讨论】:

【参考方案1】:

这一行:

p.second = pF;

正在复制一个唯一指针(即它不再是唯一的)。您可以执行以下操作:

MyPairType p;
::GetSystemTimeAsFileTime((FILETIME*)&p.first);
p.second.swap(pF);
q.push_back(p);

但请记住,pF 将不再引用指针地址。如果您想更多地引用同一地址,您需要使用std::shared_ptr

【讨论】:

shared_ptr 这是我需要使用的人。谢谢!

以上是关于如何将unique_ptr存储在队列中的主要内容,如果未能解决你的问题,请参考以下文章

如何将唯一指针向量中的每个元素排入队列? (C++)

带有 unique_ptr 的双端队列向量的编译器错误

unique_ptr 自定义存储类型示例?

我可以将函数的输出参数存储到 unique_ptr 中吗?

如何将其切换到 unique_ptr?

是否可以在C ++中的类和向量中都存储一个unique_ptr?