gpt4 book ai didi

c++ - 如何创建一个可以将 std::unique_ptr 作为模板参数正常工作的容器?

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:31 25 4
gpt4 key购买 nike

假设我有一个名为 MQueue 的互斥队列:

#include <deque>

template< typename T >
class MQueue
{
public:
T* pop()
{
lock();
T* ptr = nullptr;
// get it out of m_dq...
unlock();
return ptr;
}
// push, etc... and other methods
private:
std::deque<T*> m_dq;
};

以下实例化已经过测试并且工作正常:

MQueue< int > my_simple_mq;

我需要对 MQueue 进行什么样的修改才能确保

MQueue< std::unique_ptr< int > > my_smart_mq;

会表现得很好吗?我试图将代码浏览到 std::vector<> 以供引用,但我很难辨别实现的哪些部分与智能指针的正常工作相关。任何引用或链接将不胜感激。

最佳答案

如果您只想替换 T*unique_ptr<T> ,那么它看起来像:

template< typename T >
class MQueue
{
public:
std::unique_ptr<T> pop()
{
lock();
std::unique_ptr<T> ptr = std::move(m_dq.back());
m_dq.pop_back();
unlock();
return ptr;
}
// push, etc... and other methods
private:
std::deque<std::unique_ptr<T>> m_dq;
};

但是在阅读您对问题的评论后,现在还不清楚您要问的是什么。如果你想要你的 unqiue_ptr为了有时拥有指针而有时不拥有指针,您可以编写一个自定义删除器,其中包含一个标志,说明它是否应该删除指针。 unique_ptr的客户可以访问对删除器的引用(通过 get_deleter() 访问器)以检查/更改该标志。

下面是示例(未经测试的)代码,展示了它的外观:

template <class T>
class my_deleter
{
bool owns_;
public:
explicit my_deleter(bool owns) : owns_(owns) {}
bool owns() const {return owns_;}
void set_owns(bool owns) {owns_ = owns;}

void operator()(T* p) {if (owns_) delete p;}
};

template< typename T >
class MQueue
{
public:
typedef std::unique_ptr<T, my_deleter<T>> Ptr;
Ptr pop()
{
lock();
Ptr ptr = std::move(m_dq.back());
m_dq.pop_back();
unlock();
return ptr;
}
// push, etc... and other methods
private:
std::deque<Ptr> m_dq;
};

关于c++ - 如何创建一个可以将 std::unique_ptr 作为模板参数正常工作的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8342323/

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