gpt4 book ai didi

c++ - 这个 typedef 是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:34 26 4
gpt4 key购买 nike

我正在看这个 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;}
};

最佳答案

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 :) 这个名字很有误导性,因为类型不是真正的 bool 值。

类型T* QScopedPointer::*是一个pointer-to-member 类型。这里的这种类型接受任何 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.
};

why not QScopedPointer<T> since QScopedPointer is a template?

内部QScopedPointer<T, cleanup> , 类名 QScopedPointer可以用来代替 QScopedPointer<T, cleanup> .这称为本地声明的名称。参见 C++ template name used without template parameter了解详情。

关于c++ - 这个 typedef 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42445707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com