#c #qt #design-patterns
#c #qt #шаблоны проектирования
Вопрос:
Я читал эту статью и наткнулся на следующее определение (в qglobal.h):
template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }
template <typename Wrapper> static inline typename Wrapper::pointer qGetPtrHelper(const Wrapper amp;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;
Я понимаю, что макрос определяет общие функции для классов, которые используют шаблон общего указателя / pImpl. Однако я не совсем понимаю необходимость qGetPtrHelper
функции. Он просто возвращает копию указателя, который будет немедленно приведен. Не могла ли ptr
переменная быть приведена напрямую без этой функции?
Ответ №1:
d_ptr может быть интеллектуальным указателем (например, QScopedPointer), и в этом случае его нельзя просто передать в reinterpret_cast: d_func() должен был бы получить доступ к внутреннему указателю с помощью функции-члена или чего-то подобного, требующего двух версий макроса (фактически, до существования qGetPtrHelper их было две). Что делает qGetPtrHelper, так это запускает неявное приведение интеллектуального указателя, когда он передается в качестве аргумента, к необработанному указателю, что устраняет необходимость в специальной обработке.
Комментарии:
1. О, есть два из них, я просто опустил другой, потому что думал, что это не имеет отношения к вопросу (я тоже не понял этого, но я подумал, что задам другой вопрос, если я все еще не получу его после этого). Я думаю, это прекрасно объясняет это. Спасибо.