const class typename Besserwisser

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, sondern template<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.

const type_t var_name;

heißt bei mir immer

type_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

for(int n = 0; n < maxn; n++)
{
}

sehe, muss ich es in ein

for(int n = 0; n < maxn; ++n)
{
}

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.


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.


Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!