6

Q_OBJECT与えられた型の宣言にマクロが含まれていない場合、コンパイル エラーを表示する必要があります。私はそれを行うための1つの悪い方法を見つけました。実際には、Qt 開発者が同じトリックを行うというアイデアを繰り返しています。

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

これはうまく機能しますが、実際には奇妙なエラーメッセージが表示されます。読みやすいメッセージを表示したい。これを行う 1 つの方法は、static_assert構築を使用することです。Q_OBJECTしかし、静的に検証されたマクロの存在条件を実装する方法がわかりません。たぶん誰かが美しいハックを提案できますか? また、どんなアイデアでも大歓迎です。

4

1 に答える 1

4

これは、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) };
    };
}

ここでは、5.2 で導入された Gerrit の変更を確認できます。

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

于 2014-01-13T21:41:13.893 に答える