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 == 0
    

    Als 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 == 255
    

    Würdet ihr das trotzdem so schreiben?


  • Mod

    Ja, es ist schade, dass wir selbst mit C++14 immer noch kein funktionierendes min und max haben.
    wie wäre es mit

    y = 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'


  • Mod

    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.


  • Mod

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


Anmelden zum Antworten