c++ - 从 boost::shared_ptr 到 std::shared_ptr 的转换?

标签 c++ boost shared-ptr std

我有一个库,它在内部使用 Boost 的 shared_ptr 版本并且只公开那些。对于我的应用程序,我想尽可能使用 std::shared_ptr 。遗憾的是,这两种类型之间没有直接的转换,因为引用计数的东西是依赖于实现的。

有没有办法让 boost::shared_ptrstd::shared_ptr 共享同一个 ref-count-object?或者至少从 Boost 版本中窃取引用计数,只让 stdlib 版本处理它?<​​/p>

最佳答案

根据 janm 最初的回复,我这样做了:

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));
    }
}

这个解决方案没有理由不使用它,因为如果你转换回原来的类型,你会得到原来的指针。

关于c++ - 从 boost::shared_ptr 到 std::shared_ptr 的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6326757/

相关文章:

c++ - 如何使用移动构造函数正确处理 shared_ptr 的映射?

c++ - 在模板类中使用 shared_from_this

c++ - CertCreateCertificateContext 返回满足 ASN1 错误标记值

C++ 有没有办法根据 type_traits 进行模板重载?

c++ - 如何不使用虚拟继承?

c++ - 线程不会在 Linux 上终止,但会在 Mac 上终止

c++ - Boost C++ 库是否支持 Sparc 上的 Solaris?

c++ - 在带有转义反斜杠的 Windows 上打印 boost 路径

C++ 设置 : No match for - operator

c++ - boost::shared_ptr 和继承