web-dev-qa-db-ja.com

boost :: shared_ptrとstd :: shared_ptrの共存

ある時点でboost::logを使用したいのですが、コンパイラー(VS2010)がstd::shared_ptrに変換できないため、boost::shared_ptrをパラメーターとして渡すことができません。

私は彼らがお互いにエイリアンであるという事実が本当に好きではありません。

お互いにつまずかないように、安全で透過的な方法で相互に変換する方法はありますか?

この質問 の重複ではないと思います。両方が同じであると述べています。

43

あなたはこのようにそれを行うことができます:

template<typename T>
boost::shared_ptr<T> make_shared_ptr(std::shared_ptr<T>& ptr)
{
    return boost::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}

template<typename T>
std::shared_ptr<T> make_shared_ptr(boost::shared_ptr<T>& ptr)
{
    return std::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}

編集:これは、ソースptrへの弱参照では機能しないことに注意してください。だからそれらに注意してください!

72
ronag