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 и т. Д.).