gpt4 book ai didi

c++ - 如何在模板类中实现 move 语义

转载 作者:行者123 更新时间:2023-11-30 02:51:07 25 4
gpt4 key购买 nike

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

最佳答案

您从稍微错误的角度处理问题。 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);
}

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

对于 Pop(),情况更简单:Pop() 从队列中删除一个元素,所以你应该总是 move() it out - 你没有保留任何拷贝:

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

关于c++ - 如何在模板类中实现 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19923452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com