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