gpt4 book ai didi

c++ - qobject_cast 是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 12:30:12 31 4
gpt4 key购买 nike

我刚刚在 Qt 中找到了以下代码,我有点困惑这里发生了什么。

尤其是reinterpret_cast<T>(0)有吗?

template <class T>
inline T qobject_cast(const QObject *object)
{
// this will cause a compilation error if T is not const
register T ptr = static_cast<T>(object);
Q_UNUSED(ptr);

#if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK)
reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(const_cast<QObject *>(object)));
#endif
return static_cast<T>(const_cast<QObject *>(reinterpret_cast<T>(0)->staticMetaObject.cast(const_cast<QObject *>(object))));
}

有人愿意解释一下吗?

最佳答案

这有点复杂……

请记住 qobject_cast<T>(obj) 是一种动态转换 QObject 的方法到目标类型T这也源自 QObject .现在,为了让它工作,宏 Q_OBJECT应该包含在类 T 的定义中.

显然,qt_check_for_QOBJECT_macro call 用于检查该类是否真的包含 Q_OBJECT 宏。当宏展开时,它包含以下定义:

template <typename T> inline void qt_check_for_QOBJECT_macro(const T &_q_argument) const 
{ int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i; }

template <typename T1, typename T2>
inline int qYouForgotTheQ_OBJECT_Macro(T, T) { return 0; }

所以如果你有一个对象 x类型 T和一个对象 y类型 U , 来电x->qt_check_for_QOBJECT_macro(y)调用函数qYouForgotTheQ_OBJECT_Macro带有 T* 类型的参数和 U* .因为该函数是使用单个类型参数模板化的,所以类型 TU必须相同。

现在,如果您调用 x->qt_check_for_QOBJECT_macro(x)那么您应该期望类型相同并且编译会轻松成功。但是,请记住 this与定义该方法的类具有相同的类型。所以如果 x属于从 T 派生但不包含其自己的 qt_check_for_QOBJECT_macro 定义的类, 调用会失败。

所以我们有办法检查目标类型 T 是否包含正确的动态转换机制,但是我们还没有类型 T 的对象来调用此方法。这就是 reinterpret_cast<T>(0)是为了。我们不需要像 this 这样的实际对象,因为编译器只需要对象类型就可以成功检查。相反,我们在 T 类型的空指针上调用方法。

我认为 C++ 标准不允许这样做,但它从 this 开始有效。实际上并没有在方法内部使用。

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

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