[Development] C++20 comparisons @ Qt (was: Re: C++20 @ Qt)
Marc Mutz
marc.mutz at qt.io
Wed Sep 20 16:35:24 CEST 2023
On 20.09.23 14:42, Ivan Solovev via Development wrote:
[...]
> > O = compareThreeWay, following std::compare_three_way
> (https://en.cppreference.com/w/cpp/utility/compare/compare_three_way)
> > E = comparesEqual
> >
> > The vast majority of code will use operators to compare two objects.
> > Code that somehow needs the concept spelled out can type it out as well.
> > In contrast to `swap` we don’t need to be short here, given that the
> operator-shorthand exists.
>
> Nice suggestion, thanks! Works for me!
Yes, that would work for me, too.
> > why do we need qEquals?
>
> Actually, I have the same question. That's why I wrote that we might
> decide to not provide (4) at all.
> We have deprecated qSwap() and explicitly recommend using
>
> using std::swap;
> swap(lhs, rhs);
>
> instead. So why should we act differently for comparison?
As a first approximation, it's convenience around the
using+non-qualified call. And that convenience is substantial, just try
to calculate the noexcept for that yourself to see why (qSwap() does it,
in case you want to peek at the solution, as does C++17 with
is_nothrow_swappable).
But, as mentioned in this thread some weeks ago, we're currently lacking
public efficient API for "op== with Qt::CaseInsensitive". For the same
reason we need equal^WcomparesEqual and can't rely solely on
order^WcompareThreeWay, we need a standard way to have parametrized
checks for equality. I was also mentioning fuzzy comparisons for FP
types. Yes, we can again add QString::equals(), with the same problem
for both non-generic and generic code as with the current
QString{,View}::compare(). Or we use equal^WcomparesEqual overloads with
additional arguments and a kernel for qComparesEqualMulti that does the
moral equivalent of
using Qt::equal;
if constexpr (qxp::is_detected_v<equals_compatible_with,
decltype(lhs), decltype(rhs), decltype(extraArgs)...)) { // for each
subset of extraTypes...
if (!equals(lhs, rhs, extraArgs...)) return false;
} else {
if (!equals(lhs, rhs)) return false;
}
}
Which means that a struct { QString s; double d; } that uses our
framework will automatically be both Qt::CaseSensitive'ly and fuzzily
comparable if it adds a trailing Args&&...args and uses our qEqualMulti.
This is all a bit bigger than some static method here and there can
possibly solve.
Thanks,
Marc
More information about the Development
mailing list