首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从boost::shared_ptr到std::shared_ptr的转换?

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

Stack Overflow用户
提问于 2011-06-13 12:45:22
回答 2查看 11.5K关注 0票数 41

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

有没有办法让boost::shared_ptrstd::shared_ptr共享同一个ref-count-object?或者至少从Boost版本中窃取ref-count,只让stdlib版本来处理它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-13 14:37:36

通过使用析构函数携带引用,可以将boost::shared_ptr“放在”std::shared_ptr中:

代码语言:javascript
复制
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));

}

这样做的唯一真正原因是,如果您有一堆需要std::shared_ptr<T>的代码。

票数 31
EN

Stack Overflow用户

发布于 2012-09-26 23:16:57

根据janm的响应,我首先这样做了:

代码语言:javascript
复制
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(); });
}

但后来我意识到我可以这样做:

代码语言:javascript
复制
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));
    }
}

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

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6326757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档