2011-11-04 22 views
7

我讀this article和我橫跨以下定義來(在qglobal.h):在這個例子中qGetPtrHelper的用途是什麼?

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; 

據我所知,宏對於利用該d-指針/ PIMPL模式類定義常用功能。但是我不太瞭解qGetPtrHelper功能的需求。它只是返回一個即將播放的指針副本。如果沒有這個功能,ptr變量不能直接轉換嗎?

回答

6

d_ptr可以是一個智能指針(例如QScopedPointer),在這種情況下,它不能只傳遞給reinterpret_cast:d_func()將不得不使用成員函數訪問內部指針,所以需要兩個版本宏(實際上,qGetPtrHelper存在之前曾經有兩個)。 qGetPtrHelper所做的是在作爲參數傳遞時觸發一個智能指針的隱式轉換,將其轉換爲原始指針,從而不需要特殊處理。

+2

哦,其中有兩個,我只是省略了另一個,因爲我認爲它與問題無關(我不明白其中之一,但我想我會問另一個問題,如果我還是不要在這之後沒有得到它)​​。我認爲這很好地解釋它。謝謝。 –

相關問題