18

c++0x では、std::shared_ptr 用の std::static_pointer_cast がありますが、std::weak_ptr 用の同等のメソッドはありません。これは意図的なものですか、それとも見落としですか?見落としがある場合、適切な関数をどのように定義しますか?

4

3 に答える 3

13

これはあなたのためにそれをするはずです:

template<class T, class U>
std::weak_ptr<T>
static_pointer_cast(std::weak_ptr<U> const& r)
{
    return std::static_pointer_cast<T>(std::shared_ptr<U>(r));
}

これは、weak_ptr の有効期限が切れている場合に例外をスローします。nullのweak_ptrを取得したい場合は、r.lock()代わりに使用してください。

于 2011-05-19T23:59:49.637 に答える
6

Howard のバージョンは正しいですが、多くの場合、weakptr.lock() をパラメーターとして std::static_pointer_cast に渡すだけで十分です。

std::weak_ptr<A> a = ...;  
std::weak_ptr<B> b = std::static_pointer_cast<B>(a.lock());

この構文は何が起こっているかを明示的に示し、コードを読みやすくします。

于 2014-10-23T17:44:25.210 に答える