我需要在代码中从shared_ptr获取auto_ptr。我可以执行反向操作-将auto_ptr转换为shared_ptr,因为shared_ptr具有以下构造函数:
template<class Y> explicit shared_ptr(std::auto_ptr<Y> & r);
我可以将shared_ptr转换为auto_ptr吗?还是设计上不可能?
最佳答案
一个共享的指针可以被很多东西共享,您不能仅仅以某种方式从它们那里获取它。 Artyom和peoro对此进行了详细说明。
一种方法是制作一个临时的auto_ptr
,并从作用域末尾的指针处理中释放它。 dalle概述了第一种方法,但是这种方法缺乏异常安全性(可能会意外删除),并且无法保护您避免意外将其传递给将要转让所有权的功能(在这种情况下,删除会落在我们的手中)。
不过,我们可以制作自己的包装程序来避免这种情况:
template <typename T>
class auto_ptr_facade
{
public:
auto_ptr_facade(shared_ptr<T> ptr) :
mPtr(ptr),
mAuto(ptr.get())
{}
~auto_ptr_facade()
{
// doesn't actually have ownership
mAuto.release();
}
// only expose as const, cannot be transferred
const auto_ptr<T>& get() const
{
return mAuto;
}
operator const auto_ptr<T>&() const
{
return get();
}
private:
auto_ptr_facade(const auto_ptr_facade&);
auto_ptr_facade& operator=(const auto_ptr_facade&);
shared_ptr<T> mPtr;
auto_ptr<T> mAuto;
};
现在,您可以在范围内将
shared_ptr
像const auto_ptr
一样对待:template <typename T>
void foo(shared_ptr<T> ptr)
{
auto_ptr_facade<T> a(ptr);
// use a
}
关于c++ - 将shared_ptr转换为auto_ptr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4773546/