C++ auto



  • Ich sehe das so. In deinem Code taucht der Datentyp einer Variable nur einmal auf und zwar bei der Definition. Im restlichen Verlauf des Codes benutzt du nur noch den Variablennamen. Der Variablenname begeleitet dich in deinem Programm, nicht der Datentyp. Insofern ist der Datentyp nicht so relevant, wie die Aussagekräftigkeit eines Namens.

    Dein Code sollte sich einfach und bequem lesen und verstehen lassen. Selbst für sich sprechen. Ein Variablenname ist das A und O hierbei. Da interessiert der Datentyp nicht. Wenn interessiert das T<..>::XYZ vor einem Iterator, arbeitet und schreibe sauberen Code und minimiere alle redundaten Information, die nur den Lese- und Verständnisfluss des Codes erschweren.

    Mein Tipp, benutze auto wo es geht und "schön" aussieht. Mit der Zeit wirst du es raus haben und die Community sich daran gewöhnen. Es ist so wie mit dem var in C#. Da hat es auch ein Weilchen gedauert, bis man damit warm wurde.



  • Cyres schrieb:

    Die Genauigkeit hat mit der Plattform genau nichts zu tun 🙄

    Edit:

    TravisG schrieb:

    Mit auto erspart man sich nerviges ersetzen der floats durch double später.

    Klar wäre das ein Sinn von auto, aber man sieht nicht selten ein

    typedef float real;
    

    bzw. jetzt

    using real = float;
    

    um gerade diesem Ersetzen vorzubeugen.

    Ja, wie gesagt:

    TravisG schrieb:

    Klar, mit typedef bekommt man das auch hin, aber imo ist es mit auto schöner, weil man da später wirklich gar nichts ändern muss. Einfach neu kompilieren.

    Und was machst du mit typedef, wenn manche Funktionen aus irgendwelchen Legacy-Gründen am Ende doch noch float zurückgeben, oder wenn früher ein paar Funktionen aus irgendwelchen Gründen schon double zurückgegeben haben, und in Zukunft dafür einen 128-Bit Datentyp liefern?

    typedef float real;
    typedef double betterReal;
    

    Wäh.



  • Cyres schrieb:

    Michael E. schrieb:

    Oha? Wo ist denn die Genauigkeit festgelegt?

    In der Anzahl der Bits in einer Variablen

    Wer sagt mir denn, wie die Bits genutzt werden?



  • Michael E. schrieb:

    Cyres schrieb:

    Michael E. schrieb:

    Oha? Wo ist denn die Genauigkeit festgelegt?

    In der Anzahl der Bits in einer Variablen

    Wer sagt mir denn, wie die Bits genutzt werden?

    Es geht ja nicht darum, wie sie benutzt werden, sondern wieviele benutzt werden. Dass die Bits für eine 64-Bit Zahl mit einer 64-Bit-Architektur besser verarbeitet werden können, ist mir klar 😉



  • Cyres schrieb:

    Michael E. schrieb:

    Cyres schrieb:

    Michael E. schrieb:

    Oha? Wo ist denn die Genauigkeit festgelegt?

    In der Anzahl der Bits in einer Variablen

    Wer sagt mir denn, wie die Bits genutzt werden?

    Es geht ja nicht darum, wie sie benutzt werden, sondern wieviele benutzt werden.

    ...



  • Cyres schrieb:

    Es geht ja nicht darum, wie sie benutzt werden, sondern wieviele benutzt werden.

    Es kommt sehr wohl darauf an, wie sie benutzt werden. Vielleicht bilden je vier Bits eine Ziffer im BCD-Format. Vielleicht werden ein paar Bits überhaupt nicht benutzt. Vielleicht wird eine Darstellung gemäß IEEE 754 benutzt, vielleicht gibt es aber auch keinen Exponenten. Wie kannst du nun aus der Anzahl der Bits auf die Genauigkeit schließen?



  • Explizit ist besser als implizit, von daher ziehe ich den Typnamen auto vor.
    So zeilenlange Typnamen wie hier als Beispiel gebracht entstehen bei mir auch nicht, da ich einzelne Typen frühzeitig als typedef verpacke.

    typedef std::shared_ptr<Widget> WidgetPtr;
    typedef std::map<std::string, WidgetPtr> WidgetMapping;
    typedef std::vector<WidgetMapping> WidgetMappings;
    WidgetMappings m_mapping;
    

    anstatt

    std::vector<std::map<std::string, std::shared_ptr<Widget>>> m_mapping;
    

  • Administrator

    @Ethon,
    Wo genau siehst du nun den Vorteil gegenüber auto , wenn irgendwo im Code fernab von deinen Typdefinitionen nun das folgende steht:

    WidgetMappings mapping = getWidgetMappings();
    

    Gegenüber eben auto ?

    auto mapping = getWidgetMappings();
    

    Bei auto geht es viel eher darum Redundanz zu verhindern. Heisst der Typ, bzw. vielleicht besser die benötigte Schnittstelle, ist aus dem Kontext heraus bereits klar.

    Grüssli



  • Es geht nicht um Faulheit, sondern um Lesbarkeit. Wo die Erwähnung des expliziten Typs keinen wesentlichen Zusatzgewinn bezüglich Lesbarkeit bringt, da ist auto angebracht. Beispielsweise wenn ich ein std::map habe und ich möchte wissen, ob ein Element darin vorkommt, dann schreibe ich doch einfach:

    auto it = myMap.find(myKey);
    if (it != myMap.end())
    {
       ...
    }
    

    Wenn ich diesen Codeausschnitt lese, dann verstehe ich auf Anhieb, was hier gemacht wird. Die Erwähnung des Iteratortyps bringt mir keinen Vorteil.

    Man sollte sich bei der Formulierung von Code nicht an Bequemlichkeit orientieren, sondern klaren nachvollziehbaren Code schreiben. Das erhöht die Wartbarkeit und damit die Lebensdauer von Code.



  • Man sollte sich also nicht die Frage stellen
    "Wieso sollte ich automatische Typdeduzierung der expliziten Typangabe vorziehen?" sondern
    "Wieso sollte ich die explizite Typangabe der automatischen Typdeduzierung vorziehen?"


Anmelden zum Antworten