std::min für unterschiedliche Typen
-
Hallo Forum,
ich hätte eine recht technische Frage zu std::min, rein aus Interesse.
unsigned char x = std::numeric_limits<unsigned char>::max(); // z sei irgendein gültiger unsigned char. Mir geht es um den im folgenden "ungünstigen" Maximalwert unsigned char z = std::numeric_limits<unsigned char>::max();Weil der zweite Parameter zu int wird, mag der Compiler natürlich folgendes nicht:
unsigned char y = std::min(x, 1 + z);Verständlicherweise liefern mir diese beiden Varianten nicht das gewünchste Ergebnis:
y = std::min<unsigned char>(x, 1 + z); // y == 0 y = std::min(x, static_cast<unsigned char>(1 + z)); // y == 0Als wirklich sichere und korrekte Variante fällt mir nur folgendes ein, aber "hübsch" finde ich das nicht.
y = static_cast<unsigned char>(std::min(static_cast<int>(x), 1 + z)); // y == 255Würdet ihr das trotzdem so schreiben?
-
Ja, es ist schade, dass wir selbst mit C++14 immer noch kein funktionierendes min und max haben.
wie wäre es mity = static_cast<unsigned char>(std::min(0 + x, 1 + z)); // y == 255
-
.. das ist sehr viel schwieriger als man denkt:
siehe http://www.drdobbs.com/generic-min-and-max-redivivus/184403774 und die Links unter 'Bibliography'
-
Kenner von C++ schrieb:
.. das ist sehr viel schwieriger als man denkt:
siehe http://www.drdobbs.com/generic-min-and-max-redivivus/184403774 und die Links unter 'Bibliography'jup, aber wir haben in C++14 die notwendigen Sprachmittel um etwas Brauchbares zusammenzubauen.
-
In C++14 schreibste sowas in drei Zeilen
template <typename L, typename R> decltype(auto) min(L&& l, R&& r) {return std::forward<L>(l) > std::forward<R>(r)? Std::forward<R>(r) : std::forward<L>(l);}Wer SFINAE will nimmt common_type (ist doch jetzt endlich SFINAE friendly, oder?
)Edit: decltype vergessen. Ist schliesslich auf meinem uralten Blackberry geschrieben

-
Vielen Dank für die Antworten und Vorschläge!
Ein interessantes Thema...