【问题标题】:How to implement move semantics in a template class如何在模板类中实现移动语义
【发布时间】:2013-11-12 07:38:28
【问题描述】:

我有一个队列的模板类。我还希望能够存储包含在 std::unique_ptr 中的对象。

普通模板特化是不可能的,因为 std::unique 指针可以用任何类型实例化。

队列代码是这​​样的:

bool TQueue<T>::Push(const T& item)
{
  m_Mem[currTail] = item;
}

bool TQueue<T>::Pop( T& item )
{
  item = m_Mem[currHead];
} 

当我需要做 m_Mem[curtail] = std::move(item) 时,如何使这项工作也适用于 std::unique_ptr 类型

【问题讨论】:

    标签: c++ templates c++11 move unique-ptr


    【解决方案1】:

    你从一个稍微错误的角度来解决这个问题。 move() 不能在 Push() 内,为时已晚。它必须在外面——你不能真正窃取任意参数的资源,你必须要求用户主动将不可复制的资源移到那里。所以只需提供一个额外的重载:

    bool TQueue<T>::Push(const T& item)
    {
      m_Mem[currTail] = item;
    }
    
    bool TQueue<T>::Push(T&& item)
    {
      m_Mem[currTail] = std::move(item);
    }
    

    这样,您的用户可以在需要时主动将他们的对象移动到容器中(通过queue.Push(std::move(my_object));

    对于Pop(),情况更简单:Pop() 从队列中删除一个元素,因此您应该始终将 move() 取出 - 您不会保留任何副本:

    bool TQueue<T>::Pop( T& item )
    {
      item = std::move(m_Mem[currHead]);
    } 
    

    【讨论】:

    • 谢谢!看起来确实很明显。我会试试的。
    • 有什么建议可以为 pop 实现这个吗?在这种情况下,我无法调用重载。
    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2012-03-02
    • 2013-11-17
    • 1970-01-01
    相关资源
    最近更新 更多