我需要在代码中从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吗?还是设计上不可能?

最佳答案

一个共享的指针可以被很多东西共享,您不能仅仅以某种方式从它们那里获取它。 Artyompeoro对此进行了详细说明。

一种方法是制作一个临时的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_ptrconst 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/

10-11 18:59