static_pointer_cast для слабых_птр - PullRequest
13 голосов
/ 20 мая 2011

В c ++ 0x есть std :: static_pointer_cast для std :: shared_ptr, но нет эквивалентного метода для std :: weak_ptr. Это намеренное или недосмотр? Если недосмотр, как бы я определил соответствующую функцию?

Ответы [ 3 ]

9 голосов
/ 20 мая 2011

Это должно сделать это для вас:

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 истек.Если вы предпочли бы получить нулевой слабый_птр, используйте вместо него r.lock().

2 голосов
/ 23 октября 2014

Версия Говарда верна, но во многих случаях имеет смысл просто передать уязвимость в качестве параметра stpt :: static_pointer_cast в качестве параметра: Stpt :: static_pointer_cast:

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

Этот синтаксис явно показывает, что происходит, иоблегчает чтение кода.

0 голосов
/ 27 ноября 2014

Упущение является преднамеренным, потому что, несмотря на его имя, std :: weak_ptr не является типом указателя и не предоставляет интерфейс указателя (operator ->, operator *, static_pointer_cast и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...