Какая польза от qGetPtrHelper в этом примере? - PullRequest
7 голосов
/ 05 ноября 2011

Я читал эту статью и наткнулся на следующее определение (в qglobal.h ):

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-pointer / pImpl.Однако я не совсем понимаю необходимость функции qGetPtrHelper.Он просто возвращает копию указателя, который будет сразу же приведен.Разве переменная ptr не может быть преобразована напрямую без этой функции?

1 Ответ

6 голосов
/ 05 ноября 2011

d_ptr может быть умным указателем (например, QScopedPointer), и в этом случае его нельзя просто передать в reinterpret_cast: d_func () должен был бы получить доступ к внутреннему указателю, используя функцию-член или, таким образом, требуя две версиимакрос (на самом деле раньше было два, прежде чем существовал qGetPtrHelper).Что qGetPtrHelper делает, так это запускает неявное приведение умного указателя, когда передается в качестве аргумента, к необработанному, таким образом устраняя необходимость в специальной обработке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...