在阅读 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
that 的唯一枚举值并实现一个称为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 试图做什么。