C++:如何将 unique_ptr 推送到双端队列?

标签 c++ move-semantics unique-ptr

在我的项目中,我需要包含指向数据单元实例的智能指针的容器。我写的类(简单的例子):

template <typename T>
class Queue
{
public:

    void push(const T & param) 
    {
        m_deque.push_front(param);
    }

private:
    std::deque<T> m_deque;
};

比我想推的那个:

int main()
{

    Queue< std::unique_ptr<DataBox> > queue;

    std::unique_ptr<DataBox> d1(new DataBox(11));

    queue.push(d1);

    return 0;
}

VS2017 编译器说我不能这样做:

Error C2280 std::unique_ptr<DataBox,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function

据我所知,错误的原因是试图复制 unique_ptr。但是,如果我将签名更改为:

void push(T && param) {...}

和函数调用

queue.push( std::move(d1) );

我又遇到了这个错误。所以问题是 - 我应该如何实现 push()那会 move unique_ptr排队?

最佳答案

您应该修改您的类以处理仅 move 类型:

template <typename T>
class Queue
{
public:

    void push(const T & param) 
    {
        m_deque.push_front(param);
    }

    void push(T&& param) 
    {
        m_deque.push_front(std::move(param));
    }


private:
    std::deque<T> m_deque;
};

使用方法:

int main()
{
    Queue< std::unique_ptr<DataBox> > queue;

    std::unique_ptr<DataBox> d1(new DataBox(11));

    queue.push(std::move(d1));
}

关于C++:如何将 unique_ptr 推送到双端队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51525025/

相关文章:

c++ - 凭据提供程序的自定义 GUI

c++ - 概念示例的简单 C++ 接口(interface)

c++ - 我如何对没有复制构造函数的对象使用 std::sort?

c++ - move 语义与常量引用

与智能指针相关的 C++ move 语义与复制构造函数和赋值运算符

c++ - 使用 std::move 和 std::shared_ptr 有什么好处和风险(如果有的话)

c++ - 如果停止 QTimer,它会发出 timeout() 信号吗?

C++ sqrt 返回 -1.#IND000000000000

c++ - 有没有办法在 VS2012 中编写 make_unique() ?

c++ - 与普通指针相比,按值传递 `unique_ptr` 是否会降低性能?