2011-11-04 23 views
7

estaba leyendo this article y me encontré con la siguiente definición (en qglobal.h):¿Cuál es el uso de qGetPtrHelper en este ejemplo?

template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; } 
template <typename Wrapper> static inline typename Wrapper::pointer qGetPtrHelper(const Wrapper &p) { return p.data(); }  

#define Q_DECLARE_PRIVATE(Class) \ 
    inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \ 
    inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \ 
    friend class Class##Private; 

entiendo que la macro define funciones comunes para las clases que utilizan el patrón/pImpl D-puntero. Sin embargo, no entiendo muy bien la necesidad de la función qGetPtrHelper. Simplemente devuelve una copia de un puntero que se convertirá de inmediato. ¿No se pudo castear la variable ptr directamente sin esta función?

Respuesta

6

d_ptr puede ser un puntero inteligente (QScopedPointer, por ejemplo) y en ese caso no se puede pasar a reinterpret_cast: d_func() tendría que acceder al puntero interno utilizando una función miembro o así requerir dos versiones de la macro (de hecho, solía haber dos antes de que existiera qGetPtrHelper). Lo que hace qGetPtrHelper es desencadenar un lanzamiento implícito de un puntero inteligente, cuando se pasa como el argumento, a uno sin procesar, eliminando así la necesidad de un manejo especial.

+2

Oh, hay dos de ellos, simplemente omití el otro porque pensé que no era relevante para la pregunta (tampoco lo entendí, pero pensé que haría otra pregunta si aún me pongo lo entiendo después de este). Creo que esto lo explica muy bien. Gracias. –

Cuestiones relacionadas