Die Standardalgorithmen min
und max
können mit einem einzelnen Wert verglichen werden. Allerdings kann der minmax
Algorithmus Rückgabewert nicht gegen ein Paar von Werten verglichen werden:Vergleichen von std :: minmax mit einem Paar
#include <algorithm>
#include <utility>
template<class T1, class T2>
constexpr auto make_cref_pair(T1&& t1, T2&& t2)
{
return std::pair<T1 const&, T2 const&>(std::forward<T1>(t1), std::forward<T2>(t2));
}
int main()
{
static_assert(std::min(2, 1) == 1); // OK
static_assert(std::max(2, 1) == 2); // OK
//static_assert(std::minmax(2, 1) == std::make_pair(1, 2)); // ERROR, const int& vs int pair comparison
static_assert(std::minmax(2, 1) == std::pair<const int&, const int&>(1, 2)); // OK
static_assert(std::minmax(2, 1) == make_cref_pair(1, 2)); // OK
}
Der Grund dafür ist, dass make_pair(2, 1)
gibt ein pair<int, int>
und minmax(1, 2)
kehrt ein pair<const int&, const int&>
. Es gibt keine operator==
Überlastungsreferenzwerte für pair
.
Das Update ist dann explizit zu schreiben std::pair<const int&, const int&>(int, int)
oder um diese in eine selbstgemachte make_cref_pair
Funktion zu wickeln.
Fragen: Gibt es eine saubere Art und Weise den minmax
Rückgabewert gegen ein pair
von Werten zu vergleichen? Und habe ich die Referenzen in meiner make_cref_pair
korrekt behandelt?
Ich befürchte, dass 'make_cref_pair' nicht legal sein kann (Lebenszeitverlängerung nicht auf Unterobjekte gilt, AFAIK) – sehe
@sehe yikes. Gilt das gleiche für das nackte 'Paar (1,2)'? –
TemplateRex
Es wäre das gleiche. Ich bin mir da nicht wirklich sicher, aber es scheint so, als würde man dort am Rande spielen. – sehe