diff options
| author | Marc Mutz <marc.mutz@qt.io> | 2023-01-12 10:50:48 +0100 |
|---|---|---|
| committer | Marc Mutz <marc.mutz@qt.io> | 2023-01-13 14:38:17 +0100 |
| commit | 6ac9d46a36f1b6b921efdcb47d7b7241d2396897 (patch) | |
| tree | 9b8f75fce7f45cc08d4e6e8963d2fd26b16dc4fa /src/corelib/kernel | |
| parent | 66235481043d85e4f51a216cf2ad3bb895ea7842 (diff) | |
QPermission: don't hide SFINAE constraints
Like done elsewhere (e.g. in QStringView), formulate the constaint in
if_x<T> = true from, and let qdoc see it. Then document the constraint
in prose, too.
As a drive-by, use C++17 variable templates instead of
std::bool_value, and document that data() returns a
default-constructed T on failure (which is indistinguishable from a
successful call that happens to return a default-constructed T, so we
should probably return an optional<T> here, but that's orthogonal to
the change at hand).
Pick-to: 6.5
Change-Id: I0584ce3f4febd619d3966afeb6244b11b167cd42
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/corelib/kernel')
| -rw-r--r-- | src/corelib/kernel/qpermissions.cpp | 22 | ||||
| -rw-r--r-- | src/corelib/kernel/qpermissions.h | 20 |
2 files changed, 22 insertions, 20 deletions
diff --git a/src/corelib/kernel/qpermissions.cpp b/src/corelib/kernel/qpermissions.cpp index 4d268463474..e95ebeeb824 100644 --- a/src/corelib/kernel/qpermissions.cpp +++ b/src/corelib/kernel/qpermissions.cpp @@ -229,22 +229,32 @@ Q_LOGGING_CATEGORY(lcPermissions, "qt.permissions", QtWarningMsg); */ /*! - \fn template <typename Type> QPermission::QPermission(const Type &type) + \fn template <typename T, if_permission<T>> QPermission::QPermission(const T &type) Constructs a permission from the given \l{typed permission} \a type. You do not need to construct this type explicitly, as the type is automatically used when checking or requesting permissions. + + This constructor participates in overload resolution only if \c T is one of + the \l{typed permission} classes: + + \annotatedlist permissions */ /*! - \fn template <typename Type> Type QPermission::data() const + \fn template <typename T, if_permission<T>> T QPermission::data() const - Returns the \l{typed permission} of type \c Type. + Returns the \l{typed permission} of type \c T. - The type must match the type that was originally used to request - the permission. Use type() for dynamically choosing which typed - permission to request. + If the type doesn't match the type that was originally used to request the + permission, returns a default-constructed \c T. Use type() for dynamically + choosing which typed permission to request. + + This function participates in overload resolution only if \c T is one of + the \l{typed permission} classes: + + \annotatedlist permissions */ /*! diff --git a/src/corelib/kernel/qpermissions.h b/src/corelib/kernel/qpermissions.h index 2a23412a221..361bc868b68 100644 --- a/src/corelib/kernel/qpermissions.h +++ b/src/corelib/kernel/qpermissions.h @@ -34,31 +34,24 @@ class QPermission Q_GADGET_EXPORT(Q_CORE_EXPORT) template <typename T, typename Enable = void> - struct is_permission : public std::false_type {}; + static constexpr inline bool is_permission_v = false; template <typename T> - struct is_permission<T, typename T::QtPermissionHelper> : public std::true_type {}; + static constexpr inline bool is_permission_v<T, typename T::QtPermissionHelper> = true; + template <typename T> + using if_permission = std::enable_if_t<is_permission_v<T>, bool>; public: explicit QPermission() = default; -#ifdef Q_QDOC - template <typename Type> - QPermission(const Type &type); -#else - template <typename T, std::enable_if_t<is_permission<T>::value, bool> = true> + template <typename T, if_permission<T> = true> QPermission(const T &t) : m_data(QVariant::fromValue(t)) {} -#endif Qt::PermissionStatus status() const { return m_status; } QMetaType type() const { return m_data.metaType(); } -#ifdef Q_QDOC - template <typename Type> - Type data() const; -#else - template <typename T, std::enable_if_t<is_permission<T>::value, bool> = true> + template <typename T, if_permission<T> = true> T data() const { if (auto p = data(QMetaType::fromType<T>())) @@ -66,7 +59,6 @@ public: else return T{}; } -#endif #ifndef QT_NO_DEBUG_STREAM friend Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QPermission &); |
