static_pointer_cast для слабых_птр

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

3 ответа

Решение

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

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() вместо.

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

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

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

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

Другие вопросы по тегам