如何在模板类中实现移动语义

时间:2013-11-12 07:38:28

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

我有一个队列的模板类。我也希望能够存储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类型

1 个答案:

答案 0 :(得分:3)

你从一个稍微错误的角度接近问题。 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]);
}