2014-01-13 7 views
6

Ich habe einige interessante Notwendigkeit, einen Kompilierungsfehler anzuzeigen, wenn die Deklaration des Typs I gegeben wurde, enthält das Q_OBJECT Makro nicht. Ich habe einen schlechten Weg gefunden, es zu tun. Eigentlich wiederholt es die Idee der Qt-Entwickler den gleichen Trick zu tun:Überprüfen von Q_OBJECT Makro mit static_assert

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

Das funktioniert gut, aber es gibt in der Tat seltsame Fehlermeldung. Ich möchte eine lesbare Nachricht anzeigen. Ein Weg, dies zu tun, ist die Verwendung static_assert Konstruktion. Aber ich habe keine Ahnung, wie man die statisch verifizierte Bedingung Q_OBJECT Makro Präsenz implementieren. Vielleicht kann jemand einen schönen Hack vorschlagen? Auch jede Idee wird sehr geschätzt.

Antwort

3

Dies ist die Art und Weise how Qt does it already:

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

Beachten Sie, dass es von here obwohl eine private API verwendet:

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) }; 
    }; 
} 

Hier können Sie die Änderung auf Gerrit sehen, die in 5.2 gelandet:

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

+0

Vielen Dank, ich vergessen, dass meine Qt-Version veraltet ist, scheint, dass sie es nur in 5.2 getan haben – dvvrd