From 16bc995fd1eba4f7485226f319e7736ca19040bc Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 5 Jun 2020 12:39:58 +0200 Subject: Add type traits to safely determine the existence of comparison operators Containers often define an operator==() or operator<() which is very useful for generic code. But those operators can usually not be instantiated if the template argument doesn't implement the operator. This sometimes leads to the compiler trying all possible template expansions and implicit conversions for the type, giving extremely long error messages. The traits support can be used to safely constrain those operators. Being able to safely detect this will also allow us to fold the comparison support that is currently a large cludge for user types directly into QMetaType. Change-Id: Ib84afb5348c3eb0be5161d6ba9d5fe237709c65f Reviewed-by: Thiago Macieira --- .../corelib/kernel/qmetatype/tst_qmetatype.cpp | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) (limited to 'tests/auto/corelib/kernel/qmetatype') diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 8d4cc05eb9..22d481f5e3 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -48,6 +48,103 @@ Q_DECLARE_METATYPE(QMetaType::Type) +namespace CheckTypeTraits +{ +struct NoOperators +{ + int x; +}; +using Nested = QVector>>; +using Nested2 = QVector>>>; + +// basic types +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(QTypeTraits::has_operator_less_than_v); +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(QTypeTraits::has_operator_less_than_v); +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(QTypeTraits::has_operator_less_than_v); + +// no comparison operators +static_assert(!QTypeTraits::has_operator_equal_v); +static_assert(!QTypeTraits::has_operator_less_than_v); + +// standard Qt types +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(QTypeTraits::has_operator_less_than_v); +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(!QTypeTraits::has_operator_less_than_v); + +// QList +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(QTypeTraits::has_operator_less_than_v); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// QPair +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(QTypeTraits::has_operator_less_than_v>); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// QMap +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// QHash +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// std::vector +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(QTypeTraits::has_operator_less_than_v>); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// std::pair +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(QTypeTraits::has_operator_less_than_v>); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// std::tuple +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(QTypeTraits::has_operator_less_than_v>); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// std::map +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(QTypeTraits::has_operator_less_than_v>); +static_assert(!QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +// nested types +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(!QTypeTraits::has_operator_less_than_v); +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +static_assert(QTypeTraits::has_operator_equal_v); +static_assert(!QTypeTraits::has_operator_less_than_v); +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); +static_assert(QTypeTraits::has_operator_equal_v>); +static_assert(!QTypeTraits::has_operator_less_than_v>); + +} + + class tst_QMetaType: public QObject { Q_OBJECT -- cgit v1.2.3