C++ 在本例中,qGetPtrHelper的用途是什么?
我在阅读时,发现了以下定义(在中):C++ 在本例中,qGetPtrHelper的用途是什么?,c++,qt,design-patterns,C++,Qt,Design Patterns,我在阅读时,发现了以下定义(在中): 模板静态内联T*qGetPtrHelper(T*ptr){return ptr;} 模板静态内联typename包装器::指针qGetPtrHelper(常量包装器&p){返回p.data();} #定义Q_声明_私有(类)\ 内联类##Private*d#func(){return reinterpret_cast(qGetPtrHelper(d#ptr));}\ 内联常量类##Private*d#func()常量{return reinterpret_c
模板静态内联T*qGetPtrHelper(T*ptr){return ptr;}
模板静态内联typename包装器::指针qGetPtrHelper(常量包装器&p){返回p.data();}
#定义Q_声明_私有(类)\
内联类##Private*d#func(){return reinterpret_cast(qGetPtrHelper(d#ptr));}\
内联常量类##Private*d#func()常量{return reinterpret_cast(qGetPtrHelper(d#ptr))}\
朋友班###私人班;;
我知道宏为使用D-pointer/pImpl模式的类定义了公共函数。然而,我并不完全理解
qGetPtrHelper
函数的必要性。它只返回一个指针的副本,该副本将立即强制转换。如果没有这个函数,ptr
变量不能直接转换吗?d\ptr可以是一个智能指针(例如,QScopedPointer),在这种情况下,它不能仅仅传递给reinterpret\u cast:d\u func()必须使用成员函数访问内部指针,因此需要两个版本的宏(事实上,在qGetPtrHelper出现之前,曾经有两个)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;