簡體   English   中英

從 boost::shared_ptr 到 std::shared_ptr 的轉換?

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

我有一個庫,它在內部使用 Boost 的shared_ptr版本並且只公開那些。 對於我的應用程序,我想盡可能使用std::shared_ptr 遺憾的是,這兩種類型之間沒有直接轉換,因為引用計數的東西是依賴於實現的。

有沒有辦法讓boost::shared_ptrstd::shared_ptr共享同一個 ref-count-object? 或者至少從 Boost 版本中竊取引用計數,只讓 stdlib 版本處理它?

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

此解決方案沒有理由不使用它而不受限制,因為如果您轉換回原始類型,則會返回原始指針。

您可以通過使用析構函數攜帶引用來攜帶 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));

}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM