static_cast<double>(x) vs double(x)



  • Shade Of Mine schrieb:

    Habe das zwar noch nicht von Struppi gehört, aber von Josuttis und Vandevoorde:

    template <typename To, typename From>
    To implicit_cast (From const& value)
    {
      return value;
    }
    

    so was ähnliches findet sich in 'C++ Templates'

    Kannst du mir mal die Seitenzahl geben. Ich muss zu meiner Schande gestehen, dass ich mich weder daran erinnere, noch das ich die Stelle jetzt auf die Schnelle finde.



  • HumeSikkins schrieb:

    Was würdest du also vorschlagen wie vector designt werden sollte?

    Genauso wie es ist. Nämlich mit explicit Ctor. Ich kann den Ctor nicht für implizite Umwandlungen verwenden, ich kann also nicht schreiben 2 und schwups habe ich einen Vektor. Ich kann natürlich aber einen Vektor erzeugen und 2 als Argument übergeben: vector(2). Was ist dein Punkt?

    Mein Punkt ist, dass 2 nicht in vector umgewandelt werden kann.

    Dieser Code:

    template<typename To, typename From>
    To convert(From value)
    {
      return To(value);
    }
    

    sieht zwar OK aus - tut aber nicht das gewünschte.
    Und genau das ist beim functional style cast die Gefahr.

    Und? Der Punkt ist doch das explizit nicht cast.
    int i;
    double(i) ist der Art offensichtlich, dass ich irgendwie nicht das Problem sehe.

    für builtins ist es ja OK - aber die Gefahr ist, dass aus den builtins mal ne Klasse wird (Ich würde builtins und Objekte nicht unterschiedlich behandeln)

    Und wie wir bereits festgestellt haben ist double(x) äquivalent zu static_cast<double>(x). Da zerbricht die von dir gezogene Konsequenz doch.

    solange es bei double bleibt: ja.

    Aber kannst du garantieren dass double nicht später durch eine Klasse für große Gleitkommazahlen ersetzt wird? Dann ist Double(x) nämlich nicht mehr äquivalent zu static_cast<Double>(x).

    Die Seitenzahl aus C++ Templates weiss ich auch nicht. Hab den code von http://www.josuttis.com/tmplbook/details/implicit.cpp.html - und da ist mir gleich aufgefallen dass meine erinnerung falsch war - denn der code ging doch etwas anders... Aber die Probleme die implicit_cast hat, sind leider zu groß 😞 siehe auch boost-mailingliste



  • Shade Of Mine schrieb:

    solange es bei double bleibt: ja.
    Aber kannst du garantieren dass double nicht später durch eine Klasse für große Gleitkommazahlen ersetzt wird? Dann ist Double(x) nämlich nicht mehr äquivalent zu static_cast<Double>(x).

    Ähm, wenn ich der Klasse nen schönen Konstruktor verpasse, kann ich die Syntax doch beibehalten oder? Wenn mich nicht alles täuscht dürfte das mit dem static_cast sogar schwieriger werden.
    Insofern finde ich den Stil so sogar einheitlicher. Objektkonstruktion geht mit nem Konstruktor, und nur weil die beiden Typen halt eingebaut und sogar ineinander umwandelbar sind mache ich da auch keinen Unterschied.
    Das müßte demnach doch eigentlich in Deinem Sinne sein.


Anmelden zum Antworten