簡體   English   中英

使用static_assert檢查Q_OBJECT宏

[英]Checking Q_OBJECT macro with static_assert

如果給出類型I的聲明不包含Q_OBJECT宏,我有一些有趣的需要顯示編譯錯誤。 我找到了一種不好的方法。 實際上它重復了Qt開發人員做同樣伎倆的想法:

template<typename T>
void checkForQObjectMacro()
{
    reinterpret_cast<T *>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T *>(0));
}

這很好,但它確實給出了奇怪的錯誤信息。 我想展示一條可讀的消息。 一種方法是使用static_assert構造。 但我不知道如何實現Q_OBJECT宏存在的靜態驗證條件。 也許有人可以提出一個漂亮的黑客? 也非常感謝任何想法。

這就是Qt已經做到的方式:

Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
"No Q_OBJECT in the class with the signal");

請注意,它從這里使用私有API:

namespace QtPrivate {
    /* Trait that tells is a the Object has a Q_OBJECT macro */
    template <typename Object> struct HasQ_OBJECT_Macro {
        template <typename T>
        static char test(int (T::*)(QMetaObject::Call, int, void **));
        static int test(int (Object::*)(QMetaObject::Call, int, void **));
        enum { Value = sizeof(test(&Object::qt_metacall)) == sizeof(int) };
    };
}

在這里你可以看到Gerrit在5.2中的變化:

https://codereview.qt-project.org/#change,65508

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM