En C++ 0x, hay std :: static_pointer_cast para std :: shared_ptr, pero no hay un método equivalente para std :: weak_ptr. Es esto intencional, o un descuido? Si es un descuido, ¿cómo definiría una función apropiada?static_pointer_cast para weak_ptr
Respuesta
Esto debe hacerlo por usted:
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));
}
Esto lanzará una excepción si el weak_ptr ha expirado. Si prefiere obtener un nulo weak_ptr, entonces use r.lock()
.
versión de Howard es correcta, pero en muchos casos, tiene sentido para pasar simplemente weakptr.lock() como parámetro para std :: static_pointer_cast:
std::weak_ptr<A> a = ...;
std::weak_ptr<B> b = std::static_pointer_cast<B>(a.lock());
Esta sintaxis muestra explícitamente lo que está pasando, y marcas código fácil de leer
Parece que hay un error aquí. Como a.lock() es temporal, el puntero subyacente podría eliminarse mientras el código subsiguiente a esto todavía esté usando b. - De hecho, después de leer static_pointer_cast docs nuevamente, estoy equivocado. Devuelve un puntero compartido que se comparte con el puntero compartido subyacente de un objeto. –
La omisión es intencional porque, a pesar de su nombre, std :: weak_ptr no es un tipo de puntero y no proporciona una interfaz de puntero (operator ->, operator *, static_pointer_cast, etc.).
- 1. ¿Cómo funciona weak_ptr?
- 2. igualdad perdido entre shared_ptr y weak_ptr
- 3. boost :: python y weak_ptr: cosas que desaparecen
- 4. ¿por qué weak_ptr puede romper la referencia cíclica?
- 5. orden de clasificación de boost :: weak_ptr after expiring?
- 6. ¿Puedo obtener un puntero sin formato del weak_ptr de boost?
- 7. por qué no puedo echar a nullptr weak_ptr <>
- 8. ¿Por qué std :: hash no se definió para std :: weak_ptr en C++ 0x?
- 9. ¿Por qué std :: weak_ptr <> no proporciona una conversión bool?
- 10. ¿Debo convertir shared_ptr en weak_ptr cuando se pasa a un método?
- 11. ralentizar gdb para reproducir el error
- 12. operador == y la lista :: remove()
- 13. Fundición shared_ptr <T> a shared_ptr <void>
- 14. eliminando el elemento de la lista de weak_ptrs
- 15. puntero débil a este en el constructor
- 16. Creando un archivo seguro sin hilos shared_ptr
- 17. ¿Cómo puedo pasar boost :: shared_ptr como un puntero a una función de subproceso de Windows?
- 18. ¿Está bien heredar de los punteros inteligentes C++ 11 y anular los operadores relativos?
- 19. para - cosa vs para elif
- 20. Vacío para el bucle - para (;;)
- 21. VCLs para Delphi para Android
- 22. espera para JDialog para cerrar
- 23. ¿Cómo evitar el downcast?
- 24. Usando Visual Studio para desarrollar para C++ para Unix
- 25. Tienda de aplicaciones para iPhone 'Prepárese para cargar' para siempre
- 26. Implementando variables de condición para CRITICAL_SECTIONs para Winthreads para XP
- 27. Guía para principiantes para configurar Qt para C++
- 28. punteros compartidos, débiles y flojos en C++
- 29. ¿Qué deberíamos hacer para prepararnos para 2038?
- 30. Django: sqlite para dev, mysql para prod?
¿Conoces la historia de esto en absoluto? Dado lo trivial que fue escribir esto, me pregunto por qué el comité de normas no lo incluyó. – tgoodhart
Acabo de escanear los documentos estándares, y me parece que nadie lo propuso. Tampoco puedo encontrar un registro de que se solicite o propuse en boost (la fuente original de std :: weak_ptr). Quizás la razón es que es trivial escribir, y no trivial para elegir la política adecuada (throw o null). Y proporcionar dos funciones (una para cada política) es subóptima porque 'static_pointer_cast' pretende ser un nombre genérico, utilizable en código donde el tipo de puntero es genérico. –