如何创建一个将std::unique_ptr作为模板参数正常工作的容器?
How do I create a container that will work properly with std::unique_ptr as a template parameter?
假设我有一个名为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<>,但我很难辨别实现的哪些部分与智能指针的正常工作相关。如有任何参考或链接,将不胜感激。
如果您只是想用unique_ptr<T>
替换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
的客户端可以访问对deleter的引用(通过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;
};
相关文章:
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 如何定义在用作函数参数时工作的类模板的转换
- C++20字符串文本模板参数工作示例
- C++中的可变参数模板及其工作原理
- std::bind,无法让具有单个参数的方法工作
- 自动模板参数、数据成员和恒常性
- 隐式转换是否应该在模板参数的上下文中工作?
- 我不明白参数和参数如何协同工作
- 通过参数启用时,std::enabled_if 如何工作
- 当传递NULL作为参数时,函数重载是如何工作的
- GoogleTest 中的参数化测试无法按预期工作
- 此函数如何在不传递任何参数的情况下工作?
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 参数传递和返回值如何在程序集级别的 x86 上的 C/C++ 中工作?
- 我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?
- 工作函数重载如何使用可变参数解析?
- 宏参数的扩展如何在 c++ 中工作
- 错误太多参数无法正常工作
- 具有可变参数的std ::函数列表如何工作