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).

Change-Id: I0584ce3f4febd619d3966afeb6244b11b167cd42
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
(cherry picked from commit 6ac9d46a36f1b6b921efdcb47d7b7241d2396897)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Marc Mutz 2023-01-12 10:50:48 +01:00 committed by Qt Cherry-pick Bot
parent 9d14e35e7b
commit 6b7c5d2daf
2 changed files with 22 additions and 20 deletions

View File

@ -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
*/
/*!

View File

@ -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 &);