diff options
-rw-r--r-- | src/corelib/kernel/qcoreapplication.h | 18 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp | 24 |
2 files changed, 37 insertions, 5 deletions
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h index eb34c9aa9b..227b17ad83 100644 --- a/src/corelib/kernel/qcoreapplication.h +++ b/src/corelib/kernel/qcoreapplication.h @@ -61,6 +61,10 @@ class Q_CORE_EXPORT QCoreApplication Q_DECLARE_PRIVATE(QCoreApplication) friend class QEventLoopLocker; +#if QT_CONFIG(permissions) + using RequestPermissionPrototype = void(*)(QPermission); +#endif + public: enum { ApplicationFlags = QT_VERSION }; @@ -124,21 +128,25 @@ public: # else // requestPermission with context or receiver object; need to require here that receiver is the // right type to avoid ambiguity with the private implementation function. - template <typename Functor> + template <typename Functor, + std::enable_if_t< + QtPrivate::AreFunctionsCompatible<RequestPermissionPrototype, Functor>::value, + bool> = true> void requestPermission(const QPermission &permission, const typename QtPrivate::ContextTypeForFunctor<Functor>::ContextType *receiver, Functor &&func) { - using Prototype = void(*)(QPermission); - QtPrivate::AssertCompatibleFunctions<Prototype, Functor>(); requestPermission(permission, - QtPrivate::makeCallableObject<Prototype>(std::forward<Functor>(func)), + QtPrivate::makeCallableObject<RequestPermissionPrototype>(std::forward<Functor>(func)), receiver); } # endif // Q_QDOC // requestPermission to a functor or function pointer (without context) - template <typename Functor> + template <typename Functor, + std::enable_if_t< + QtPrivate::AreFunctionsCompatible<RequestPermissionPrototype, Functor>::value, + bool> = true> void requestPermission(const QPermission &permission, Functor &&func) { requestPermission(permission, nullptr, std::forward<Functor>(func)); diff --git a/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp b/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp index 146c1b2660..8f257eba8b 100644 --- a/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp +++ b/tests/auto/corelib/kernel/qpermission/tst_qpermission.cpp @@ -146,6 +146,19 @@ void tst_QPermission::conversionMaintainsState() const } } +template <typename Func, + typename T = std::void_t<decltype(qApp->requestPermission(std::declval<DummyPermission>(), + std::declval<Func>()))> + > +void wrapRequestPermission(const QPermission &p, Func &&f) +{ + qApp->requestPermission(p, std::forward<Func>(f)); +} + +template <typename Functor> +using CompatibleTest = decltype(wrapRequestPermission(std::declval<QPermission>(), std::declval<Functor>())); + + // Compile test for context-less functor overloads void tst_QPermission::functorWithoutContext() { @@ -161,6 +174,17 @@ void tst_QPermission::functorWithoutContext() qApp->requestPermission(dummy, [](const QPermission &permission){ QVERIFY(permission.value<DummyPermission>()); }); + wrapRequestPermission(dummy, [](const QPermission &permission){ + QVERIFY(permission.value<DummyPermission>()); + }); + + auto compatible = [](const QPermission &) {}; + using Compatible = decltype(compatible); + auto incompatible = [](const QString &) {}; + using Incompatible = decltype(incompatible); + + static_assert(qxp::is_detected_v<CompatibleTest, Compatible>); + static_assert(!qxp::is_detected_v<CompatibleTest, Incompatible>); } void tst_QPermission::functorWithContextInThread() |