简体   繁体   English

从 boost::shared_ptr 到 std::shared_ptr 的转换?

[英]Conversion from boost::shared_ptr to std::shared_ptr?

I got a library that internally uses Boost's version of shared_ptr and exposes only those.我有一个库,它在内部使用 Boost 的shared_ptr版本并且只公开那些。 For my application, I'd like to use std::shared_ptr whenever possible though.对于我的应用程序,我想尽可能使用std::shared_ptr Sadly, there is no direct conversion between the two types, as the ref counting stuff is implementation dependent.遗憾的是,这两种类型之间没有直接转换,因为引用计数的东西是依赖于实现的。

Is there any way to have both a boost::shared_ptr and a std::shared_ptr share the same ref-count-object?有没有办法让boost::shared_ptrstd::shared_ptr共享同一个 ref-count-object? Or at least steal the ref-count from the Boost version and only let the stdlib version take care of it?或者至少从 Boost 版本中窃取引用计数,只让 stdlib 版本处理它?

Based on janm's response at first I did this:根据 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(); });
}

But then I realized I could do this instead:但后来我意识到我可以这样做:

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

This solution leaves no reason for not using it without restrictions since you get the original pointer back if you convert back to the original type.此解决方案没有理由不使用它而不受限制,因为如果您转换回原始类型,则会返回原始指针。

You can carry the boost::shared_ptr "inside" the std::shared_ptr by using the destructor to carry the reference around:您可以通过使用析构函数携带引用来携带 boost::shared_ptr “内部” 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));

}

The only real reason to do this is if you have a bunch of code that expects std::shared_ptr<T> .这样做的唯一真正原因是,如果您有一堆需要std::shared_ptr<T>的代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM