gpt4 book ai didi

c++ - 奇怪的 static_cast 把戏?

转载 作者:可可西里 更新时间:2023-11-01 15:51:41 27 4
gpt4 key购买 nike

在仔细阅读 Qt 源代码时,我遇到了这个 gem:

template <class T> inline T qgraphicsitem_cast(const QGraphicsItem *item)
{
return int(static_cast<T>(0)->Type) == int(QGraphicsItem::Type)
|| (item && int(static_cast<T>(0)->Type) == item->type()) ? static_cast<T>(item) : 0;
}

注意 static_cast<T>(0)->Type ?我已经使用 C++ 很多年了,但以前从未见过 0 在 static_cast 中使用过。这段代码在做什么,它安全吗?

背景:如果您从 QGraphicsItem 派生您打算声明一个名为 Type 的唯一枚举值并实现一个名为 type 的虚函数返回它,例如:

class Item : public QGraphicsItem
{
public:
enum { Type = MAGIC_NUMBER };
int type() const { return Type; }
...
};

然后你可以这样做:

QGraphicsItem* item = new Item;
...
Item* derivedItem = qgraphicsitem_cast<Item*>(item);

这可能有助于解释 static_cast 试图做什么。

最佳答案

这看起来是一种非常可疑的静态断言模板参数 T 的方式。有一个 Type成员,然后验证它的值是预期的魔数(Magic Number),就像你声明你应该做的那样。

Type是一个枚举值,this访问它不需要指针,所以 static_cast<Item>(0)->Type检索 Item::Type 的值没有实际使用指针的值。所以这可行,但可能是未定义的行为(取决于您对标准的看法,但无论如何 IMO 都是一个坏主意),因为代码使用指针取消引用运算符( -> )取消引用 NULL 指针。但我想不出为什么这比 Item::Type 更好或模板 T::Type - 也许它是设计用于模板支持较差的旧编译器的遗留代码,无法解决问题 T::Type应该是这个意思。

不过,最终结果还是像qgraphicsitem_cast<bool>(ptr)这样的代码在编译时会失败,因为bool没有Type成员枚举。这比运行时检查更可靠、成本更低,即使代码看起来像 hack。

关于c++ - 奇怪的 static_cast 把戏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2995774/

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