C++ 这个typedef是如何工作的?
我正在看cpp闪电演讲 这里显示了0:37的代码片段C++ 这个typedef是如何工作的?,c++,C++,我正在看cpp闪电演讲 这里显示了0:37的代码片段 template<typename T, typename cleanup = QScopedPointerDeleter<T>> class QScopedPointer{ typedef T *QScopedPointer::*RestrictedBool; // how does this work? //why not QScopedPointer<
template<typename T, typename cleanup = QScopedPointerDeleter<T>>
class QScopedPointer{
typedef T *QScopedPointer::*RestrictedBool; // how does this work?
//why not QScopedPointer<T> since QScopedPointer is a template?
public:
inline operator RestrictedBool() const
{
return isNull()? Q_NULLPTR : &QScopedPointer::d;
}
inline bool isNull() const{ return !d;}
protected:
T *d;
};
当我们移动恒星时,这一点可以稍微弄清楚:
typedef T* QScopedPointer::* RestrictedBool;
// ^~~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~
// the type the alias
在C++11中,我们将把它写得更清楚
using RestrictedBool = T* QScopedPointer::*;
RestrictedBool
此处声明为T*QScopedPointer::*
的类型别名。因此,typedef T*F::bool
失败,因为您无法重新定义bool
:)该名称非常容易引起误解,因为该类型实际上不是布尔类型
类型T*QScopedPointer::*
是指向成员的指针。这里的类型接受QScopedPointer
类中的任何T*
成员,例如
class QScopedPointer {
operator RestrictedBool() const {
// ^~~~~~~~~~~~~~
// this function returns a `RestrictedBool` = `T* QScopedPointer::*`
return isNull()? Q_NULLPTR : &QScopedPointer::d;
// ^~~~~~~~~~~~~~~~~~
// and this expression has type `T* QScopedPointer::*`
}
T *d;
// ^~~
// the `d` member has type `T*` in the `QScopedPointer` class.
};
既然
QScopedPointer
是一个模板,为什么不QScopedPointer
呢
在
QScopedPointer
内部,可以使用类名QScopedPointer
代替QScopedPointer
。这称为本地声明的名称。有关详细信息,请参见。Pro提示:查看使用该类型存储的值:&QScopedPointer::d
是指向成员指针的指针。还要注意,typedef
的语法是typedef
。注意RestrictedBool
是新名称,不能在typedef中使用bool
作为新名称。您也不需要在自己的类定义中使用类模板参数。
using RestrictedBool = T* QScopedPointer::*;
class QScopedPointer {
operator RestrictedBool() const {
// ^~~~~~~~~~~~~~
// this function returns a `RestrictedBool` = `T* QScopedPointer::*`
return isNull()? Q_NULLPTR : &QScopedPointer::d;
// ^~~~~~~~~~~~~~~~~~
// and this expression has type `T* QScopedPointer::*`
}
T *d;
// ^~~
// the `d` member has type `T*` in the `QScopedPointer` class.
};