diff options
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 05fe4450df..60192e4131 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -2796,6 +2796,35 @@ constexpr QMetaTypeInterface *qMetaTypeInterfaceForType() } } +namespace detail { + +template <typename T, typename ODR_VIOLATION_PREVENTER> +struct is_complete_helper { + template <typename U> + static auto check(U*) -> std::integral_constant<bool, sizeof(U) != 0>; + static auto check(...) -> std::false_type; + using type = decltype(check(static_cast<T*>(nullptr))); +}; + +} + +template <typename T, typename ODR_VIOLATION_PREVENTER> +struct is_complete : detail::is_complete_helper<T, ODR_VIOLATION_PREVENTER>::type {}; + +template<typename Unique, typename T> +constexpr QMetaTypeInterface *qTryMetaTypeInterfaceForType() +{ + using Ty = std::remove_cv_t<std::remove_reference_t<T>>; + using Tz = std::remove_pointer_t<Ty>; + if constexpr (!is_complete<Tz, Unique>::value) { + return nullptr; + } else if constexpr (std::is_same_v<Ty, void>) { + return nullptr; + } else { + return &QMetaTypeForType<Ty>::metaType; + } +} + } // namespace QtPrivate template<typename T> @@ -2809,6 +2838,11 @@ QtPrivate::QMetaTypeInterface *const qt_metaTypeArray[] = { QtPrivate::qMetaTypeInterfaceForType<T>()... }; +template<typename Unique,typename... T> +QtPrivate::QMetaTypeInterface *const qt_incomplete_metaTypeArray[] = { + QtPrivate::qTryMetaTypeInterfaceForType<Unique, T>()... +}; + QT_END_NAMESPACE #endif // QMETATYPE_H |