我正在看这个cpp闪电话video 它在0:37显示这段代码
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;
,这是什么意思?
我创建了一个类似的类F
,但它没有编译,class QScopedPointer
和class F
中的两个typedef有什么区别?
template<typename T>
class F{
typedef T *F::*bool;
public:
operator bool(){return true;}
};
答案 0 :(得分:6)
typedef T *QScopedPointer::*RestrictedBool;
当我们移动星星时,可以清楚地说明这一点:
typedef T* QScopedPointer::* RestrictedBool;
// ^~~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~
// the type the alias
在C ++ 11中,我们将更清楚地写为
using RestrictedBool = T* QScopedPointer::*;
RestrictedBool
此处被声明为T* QScopedPointer::*
的类型别名。所以typedef T *F::bool
失败了因为你无法重新定义bool
:)这个名字很容易引起误解,因为这个类型实际上并不是一个布尔值。
类型T* QScopedPointer::*
是指向成员的指针类型。此处此类型接受T*
类中的所有QScopedPointer<T, cleanup>
成员,例如我们看到
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<T>
,因为QScopedPointer
是模板?
在QScopedPointer<T, cleanup>
内,可以使用班级名称QScopedPointer
代替QScopedPointer<T, cleanup>
。这称为本地声明的名称。有关详细信息,请参阅C++ template name used without template parameter。