Подтвердить что ты не робот

Static_pointer_cast для weak_ptr

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

4b9b3361

Ответ 1

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

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().

Ответ 2

Версия Howard верна, но во многих случаях имеет смысл просто передать weakptr.lock() в качестве параметра в std:: static_pointer_cast:

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

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

Ответ 3

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