summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetatype.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r--src/corelib/kernel/qmetatype.h20
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