2011-11-04 7 views
7

czytałem this article i natknąłem się następującą definicją (w qglobal.h):Jaki jest pożytek z qGetPtrHelper w tym przykładzie?

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; 

Rozumiem, że makro określa wspólne funkcje dla klas, które wykorzystują D-pointer/pImpl wzór. Jednak nie bardzo rozumiem potrzebę funkcji qGetPtrHelper. Po prostu zwraca kopię wskaźnika, który zostanie od razu rzucony. Nie można zmienić wartości zmiennej ptr bezpośrednio bez tej funkcji?

Odpowiedz

6

d_ptr może być inteligentnym wskaźnikiem (na przykład QScopedPointer) iw takim przypadku nie można go po prostu przekazać do reinterpret_cast: d_func() musiałby uzyskać dostęp do wewnętrznego wskaźnika za pomocą funkcji składowej lub wymagać dwóch wersji makro (w rzeczywistości istniały dwa przed istnieniem qGetPtrHelper). To, co robi qGetPtrHelper, to wyzwolenie niejawnego rzutu inteligentnego wskaźnika, gdy przekazany jako argument, do surowego, eliminując w ten sposób potrzebę specjalnej obsługi.

+2

Och, jest ich dwóch, po prostu pominąłem ten drugi, ponieważ myślałem, że to nie ma znaczenia dla pytania (tego też nie zrozumiałem, ale pomyślałem, że zadam jeszcze jedno pytanie, czy nadal będę nie rozumiem tego po tym). Myślę, że to ładnie to tłumaczy. Dzięki. –

Powiązane problemy