В С++ 0x существует std:: static_pointer_cast для std:: shared_ptr, но нет эквивалентного метода для std:: weak_ptr. Является ли это преднамеренным или надзором? Если надзор, как бы я определил соответствующую функцию?
Static_pointer_cast для weak_ptr
Ответ 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 и т.д.).