2011-11-04 7 views
7

Iは、this articleを読んでいたと私は(qglobal.hで)次の定義に出くわした:私はマクロD-ポインタ/ PIMPLパターンを利用するクラスの一般的な機能を定義することを理解この例では、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; 

。しかし、私は、qGetPtrHelper機能の必要性を十分に把握していません。すぐにキャストされるポインタのコピーを返します。 ptr変数はこの関数なしで直接キャストできませんでしたか?

答えて

6

d_ptrはスマートポインタ(例えばQScopedPointer)にすることができ、その場合はreinterpret_castに渡すことはできません:d_func()は、メンバ関数を使用して内部ポインタにアクセスするか、マクロ(qGetPtrHelperが存在する前は実際には2つありました)。 qGetPtrHelperの機能は、引数として渡されたスマートポインタの暗黙のキャストを生のキャストにトリガーし、特別な処理の必要性を排除することです。

+2

オハイオ州には2つありますが、私はそれが問題に関連していないと思ったのでもう一方を省略しました(私はそれも理解できませんでしたが、まだドンすれば別の質問をしますこの後にそれを取得しないでください)。私はこれがうまくそれを説明すると思います。ありがとう。 –

関連する問題