Qt のソース コードを熟読しているときに、この宝石に出会いました。
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++ を使用してきましたが、static_cast で 0 が使用されているのを見たことがありません。このコードは何をしていて、安全ですか?
背景: から派生する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 が何をしようとしているのかを説明するのに役立ちます。