1

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

4

1 回答 1

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]);
} 
于 2013-11-12T07:44:02.357 回答