从整数到枚举的首选转换样式QEvent :: Type

时间:2019-01-14 10:13:07

标签: c++ qt casting

我正在从文档http://doc.qt.io/qt-5/statemachine-api.html看这个Qt的示例:

bool eventTest(QEvent *e) override
{
    if (e->type() != QEvent::Type(QEvent::User+1)) // StringEvent
        return false;
    StringEvent *se = static_cast<StringEvent*>(e);
    return (m_value == se->value);
}

但是在这一行:

e->type() != QEvent::Type(QEvent::User+1)

我不明白这里是否需要显式强制转换,即enum Event::Type的整数值,因为以下内容也可以工作:

e->type() != QEvent::User+1 // no explicit cast    

那么使用显式强制转换更好,为什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

QEvent::User + 1的类型为int。当然,将结果转换为QEvent::Type会将其转换为QEvent::Type,而我猜那是它的原始类型以及e->Type()的类型。

您是对的,尽管原因不那么直接,但是不需要强制转换。在e->Type() == QEvent::User + 1中,右侧的类型为int,因此左侧被提升为int,并且在int值上进行比较。通常,这完全可以。自远古以来就是使用enums的方式。在我看来,这种投射就像将形式主义推向现实。有些人喜欢这样做。

答案 1 :(得分:0)

摘自enum的在线文档

  

尽管可以使用static_cast来获取枚举器的数值,但没有从范围内的枚举器的值到整数类型的隐式转换。

所以,是的,您需要对此类转换进行显式转换。

但是,即使QEvent::Type不是有作用域的枚举并允许隐式转换,static_cast也是实现它的好方法。

请阅读以下常见问题解答:What good is static_cast?