47

我想boost::log在某个时候使用,但我无法将 astd::shared_ptr作为参数传递,因为编译器(VS2010)无法将其转换为boost::shared_ptr.

我真的不喜欢他们彼此是外星人这一事实。

是否有一种安全且透明的方法可以将一个转换为另一个,以免它们相互绊倒?

我不认为这两个问题是相同的。

4

1 回答 1

75

你可以这样做:

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 的弱引用。所以要小心那些!

于 2012-09-07T09:07:04.643 回答