Просматривая исходный код 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
? Я использую С++ в течение многих лет, но никогда не видел, чтобы 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.