这种typedef如何工作?

时间:2017-02-24 18:21:44

标签: c++

我正在看这个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 QScopedPointerclass F中的两个typedef有什么区别?

 template<typename T>
 class F{
  typedef T *F::*bool;
  public:
   operator bool(){return true;}
 };

1 个答案:

答案 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