Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在本例中,qGetPtrHelper的用途是什么?_C++_Qt_Design Patterns - Fatal编程技术网

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;