const class typename Besserwisser
« | 10 Nov 2018 | »Es ist oft ganz lustig, wenn man Leute (oder auch sich selbst) dabei ertappt, wenn sie altkluge Belehrungen zum Besten geben.
Aber das ist menschlich und auch nicht wirklich schlimm.
Da kam einmal die Frage an mein Ohr:
Wusstest du nicht, dass man heute nicht mehr
template<class ...>
schreibt, sonderntemplate<typename ...>
?
Man erkennt dann beim Gegenüber, dass jetzt ein “Oh Gott, Nein” von einem selbst erwartet wird.
Meine Antwort fällt hier etwas kompliziert aus.
Ich habe mir
template<class T>
fix angewöhnt weil es laut Standard vollkommen gleichwertig zu
template<typename T>
ist, aber es gibt/gab einen Compiler, der mit der
typename
Variante
nicht klar kam. Und das war
Borland C++.
Tatsächlich musste ich einmal hunderte Zeilen von template<typename ...>
auf
class
umstellen um diesen dummen Implementierungsfehler zu umgehen. Von da
an war für mich klar, dass template<class T>
automatisch richtiger ist, weil
diese Variante eben mit allen mir damals bekannten Compilern lief.
Seltener wundert sich jemand in meinen Codes darüber, dass ich template
Funktionen auf template
Objekte umleite, wo wieder eine statische Funktion
drinnen ist.
Auch hier kann ich auf einen Defekt in einem Compiler verweisen, nämlich
im OpenWatcom.
Der konnte früher Templates nur dann
spezialisieren,
wenn es sich um struct
oder class
Elemente handelte, reine Funktionen
verweigerte er aber mit Fehlern.
Und so gibt es noch ein paar Geschichten aus der Vergangenheit, warum ich bis heute einige Konstrukte bewusst vermeide. Oft ist damit eine dunkle Erinnerung von früher verbunden, wo ein Compiler ein Konstrukt nur in einer ganz bestimmten Art und Weise verstehen wollte.
Es ist vielleicht manchmal etwas überzogen, aber letztendlich sind diese Alternativen, die ich bevorzuge, kein Hindernisse.
Es gibt aber auch paar Besonderheiten, die ich aus tiefer religiöser Überzeugung an den Tag bringe.
1const type_t var_name;
heißt bei mir immer
1type_t const var_name;
… und meine Schreibweise ist natürlich die allgemein-gültig korrekte.
Qualifier stehen immer nach dem Typen.
const
applies to the thing left of it. If there is nothing on the left then it applies to the thing right of it.
Also nur in bestimmten Situationen ist es auch erlaubt ihn vorne anzustellen.
… und so hat sich const type_t
leider eingebürgert, weil es
der natürlichen Sprache näher steht.
Und wenn ich ein
sehe, muss ich es in ein
abändern. Keine Ahnung, weshalb selbst in Büchern n++
gelehrt wird,
obwohl wir so ja einen ungenützten temporären Zwischenwert erzeugen.
++n
ist hier natürlich richtiger!
Und nur weil bei int
der Optimizer wieder alles in Ordnung bringt,
kann es ja sein, dass mein selbstgeschriebener Iterator im
Postfix-Increment Operator
etwas Sinnloses und Vermeidbares tut.
Fazit
Ich geb’ ja zu … im Alter wird man etwas klugscheißerisch.
Aber hey … ich liebe sie eben … die Programmierung, und deshalb erwarte ich auch viel von allen anderen Programmierern.