大佬教程收集整理的这篇文章主要介绍了c – 奇怪的static_cast技巧?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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; }@H_403_3@注意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; } ... };@H_403_3@你可以这样做:
QGraphicsItem* item = new Item; ... Item* derivedItem = qgraphicsitem_cast<Item*>(item);@H_403_3@这可能有助于解释static_cast正在尝试做什么.
因为Type是一个枚举值,所以不需要这个指针来访问它,所以static_cast< Item>(0) – > Type检索Item :: Type的值,而不实际使用指针的值.所以这有效,但是可能是未定义的行为(取决于您对标准的看法,但是IMO是一个坏主意),因为代码使用指针dereference操作符( – >)来引用NULL指针.但是,我不能想像为什么这更好的只是Item :: Type或模板T :: Type – 也许这是旧的代码设计工作在旧的编译器与不良的模板支持,无法解决什么T :: Type应该是意思
尽管如此,最终的结果是在编译时由于bool没有类型成员枚举而导致的代码如qgraphicsitem_cast< bool>(ptr)将失败.这比运行时检查更可靠和便宜,即使代码看起来像一个黑客.
以上是大佬教程为你收集整理的c – 奇怪的static_cast技巧?全部内容,希望文章能够帮你解决c – 奇怪的static_cast技巧?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。