diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2014-08-10 14:11:26 +0200 |
---|---|---|
committer | Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com> | 2015-02-05 14:27:59 +0000 |
commit | d43d03529f7bc169776be161c2978856eefb0e93 (patch) | |
tree | 6a0d69842699351012a10d375467ea11a25c4bbc /src/corelib/kernel/qmetatype.h | |
parent | 9e6190cff3f78428eb4bedbb3f267f3d7a43f469 (diff) |
QMetatype: Register the QMetaObject of a Q_ENUM or Q_FLAG
Change-Id: Id1343c3fb51d88a43d4d97e8859dbe2b0cfbea34
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 2ff695b833..5ca44f9440 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1363,12 +1363,25 @@ namespace QtPrivate enum { Value = sizeof(checkType(static_cast<T*>(0))) == sizeof(void*) }; }; + char qt_getEnumMetaObject(...); + char qt_getEnumMetaObject(); // Workaround bugs in MSVC. + + template<typename T> + struct IsQEnumHelper { + static const T &declval(); + enum { Value = sizeof(qt_getEnumMetaObject(declval())) == sizeof(QMetaObject*) }; + }; + template<typename T, typename Enable = void> struct MetaObjectForType { static inline const QMetaObject *value() { return 0; } }; - + template<> + struct MetaObjectForType<void> + { + static inline const QMetaObject *value() { return Q_NULLPTR; } + }; template<typename T> struct MetaObjectForType<T*, typename QEnableIf<IsPointerToTypeDerivedFromQObject<T*>::Value>::Type> { @@ -1379,6 +1392,11 @@ namespace QtPrivate { static inline const QMetaObject *value() { return &T::staticMetaObject; } }; + template<typename T> + struct MetaObjectForType<T, typename QEnableIf<IsQEnumHelper<T>::Value>::Type > + { + static inline const QMetaObject *value() { return qt_getEnumMetaObject(T()); } + }; template<typename T> struct IsSharedPointerToTypeDerivedFromQObject |