Это выглядит как очень сомнительный способ статически утверждать, что параметр шаблона T
имеет член Type
, а затем проверить, что его значением является ожидаемое магическое число, как вы утверждаете, что должны делать.
Так как Type
является значением перечисления, указатель this
не требуется для доступа к нему, поэтому static_cast<Item>(0)->Type
извлекает значение Item::Type
без фактического использования значения указателя.Так что это работает, но, возможно, это неопределенное поведение (в зависимости от вашего взгляда на стандарт, но в любом случае IMO - плохая идея), потому что код разыменовывает указатель NULL с помощью оператора разыменования указателя (->
).Но я не могу понять, почему это лучше, чем Item::Type
или шаблон T::Type
- возможно, это устаревший код, предназначенный для работы на старых компиляторах с плохой поддержкой шаблонов, который не может понять, что должно означать T::Type
.
Тем не менее, конечным результатом является код, такой как qgraphicsitem_cast<bool>(ptr)
, не выполнится во время компиляции , поскольку bool
не имеет Type
перечисления членов.Это более надежно и дешевле, чем проверки во время выполнения, даже если код выглядит как взлом.