从boost :: shared_ptr转换为std :: shared_ptr?

问题描述

| 我得到了一个内部使用Boost \ 0版本的库,仅公开了那些库。对于我的应用程序,我想尽可能使用
std::shared_ptr
。可悲的是,这两种类型之间没有直接转换,因为ref计数内容取决于实现。 有什么办法可以让
boost::shared_ptr
std::shared_ptr
共享相同的引用计数对象?还是至少从Boost版本中窃取了引用计数,而仅让stdlib版本来处理它?     

解决方法

        您可以通过使用析构函数携带引用周围的boost :: shared_ptr \“ inside \” std :: shared_ptr:
template<typename T>
void do_release(typename boost::shared_ptr<T> const&,T*)
{
}

template<typename T>
typename std::shared_ptr<T> to_std(typename boost::shared_ptr<T> const& p)
{
    return
        std::shared_ptr<T>(
                p.get(),boost::bind(&do_release<T>,p,_1));

}
这样做的唯一真实原因是,如果您有一堆期望为5的代码。     ,        首先,基于詹姆的回答,我做到了:
template<class T> std::shared_ptr<T> to_std(const boost::shared_ptr<T> &p) {
    return std::shared_ptr<T>(p.get(),[p](...) mutable { p.reset(); });
}

template<class T> boost::shared_ptr<T> to_boost(const std::shared_ptr<T> &p) {
    return boost::shared_ptr<T>(p.get(),[p](...) mutable { p.reset(); });
}
但是后来我意识到我可以改为这样做:
namespace {
    template<class SharedPointer> struct Holder {
        SharedPointer p;

        Holder(const SharedPointer &p) : p(p) {}
        Holder(const Holder &other) : p(other.p) {}
        Holder(Holder &&other) : p(std::move(other.p)) {}

        void operator () (...) { p.reset(); }
    };
}

template<class T> std::shared_ptr<T> to_std_ptr(const boost::shared_ptr<T> &p) {
    typedef Holder<std::shared_ptr<T>> H;
    if(H *h = boost::get_deleter<H>(p)) {
        return h->p;
    } else {
        return std::shared_ptr<T>(p.get(),Holder<boost::shared_ptr<T>>(p));
    }
}

template<class T> boost::shared_ptr<T> to_boost_ptr(const std::shared_ptr<T> &p){
    typedef Holder<boost::shared_ptr<T>> H;
    if(H * h = std::get_deleter<H>(p)) {
        return h->p;
    } else {
        return boost::shared_ptr<T>(p.get(),Holder<std::shared_ptr<T>>(p));
    }
}
该解决方案没有理由不加限制地使用它,因为如果您转换回原始类型,则会得到原始指针。