Search code examples
c++boostc++11shared-ptr

Cohabitation of boost::shared_ptr and std::shared_ptr


I want to use boost::log at some point, but I cannot pass a std::shared_ptr as a parameter, because the compiler (VS2010) cannot convert it into a boost::shared_ptr.

I don't really like the fact that they are aliens to one another.

Is there a safe and transparent way to convert one into the another, so as they don't stumble over each other?

I don't think it is duplicate of this question that states both are the same.


Solution

  • You could do it like this:

    template<typename T>
    boost::shared_ptr<T> make_shared_ptr(std::shared_ptr<T>& ptr)
    {
        return boost::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
    }
    
    template<typename T>
    std::shared_ptr<T> make_shared_ptr(boost::shared_ptr<T>& ptr)
    {
        return std::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
    }
    

    EDIT: Note that this does not work with weak references to the source ptr. So be careful with those!