Warum soll C++ nur etwas oberflächlich dem parametrisierten Polymorphismus ähnliches implementieren? Insbesondere sind Vorlagen kein Beispiel für einen vollständigen parametrischen Polymorphismus?
Vorlagen-Funktionen in C++ funktionieren auf der Grundlage der "Substitution" des Parameters. Das bedeutet im Wesentlichen, dass der Compiler eine weitere Version der Funktion generiert, in der die Template-Argumente in die Funktion festgeschrieben sind.
Angenommen, Sie dies in C++ haben:
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int i = add(2, 3);
double d = add(2.7, 3.8);
return i + (int)d;
}
Beim Übersetzen, das in zwei Funktionen führen wird: int add(int a, int b) { return a + b; }
und double add(double a, double b) { return a + b; }
Eine Funktion wird nur behandeln Ints, und der andere wird nur behandeln verdoppelt. Kein Polymorphismus.
Also wirklich, Sie am Ende mit so vielen Implementierungen wie die Anzahl der Variationen von Argumenten.
"Aber warum ist das nicht parametrischen Polymorphismus?" könnten Sie fragen?
Sie benötigen den vollständigen Quellcode der 'add' -Funktion, um ihn mit Ihrer eigenen speziellen Variante von etwas aufzurufen, das den binären '+' Operator überlastet! - Das ist das Detail, das den Unterschied macht.
Wenn C++ den richtigen parametrischen Polymorphismus hatte, wie zum Beispiel C#, würde Ihre endgültige kompilierte Implementierung von 'add' genug Logik enthalten, um zur Laufzeit zu bestimmen, welche '+' Überladung für einen beliebigen Parameter akzeptabel wäre. Und Sie würden den Quellcode für diese Funktion nicht brauchen, um ihn mit neuen Typen zu benennen, die Sie erfunden haben.
Was bedeutet das in Wirklichkeit?
Aber verstehe das nicht, als ob C++ weniger mächtig oder C# leistungsfähiger ist. Es ist einfach eines von vielen Sprachmerkmalsdetails.
Wenn Sie die vollständige Quelle für Ihre Vorlagenfunktionen zur Verfügung haben, dann ist die Semantik von C++ weit überlegen. Wenn Sie nur eine statische oder dynamische Bibliothek zur Verfügung haben, ist eine parametrische polymorphe Implementierung (z. B. C#) überlegen.
Unabhängig von der Antwort auf diese Frage, die Wikipedia-Seite braucht viel Liebe ... – Barry
Diese Wiki-Seite kommt aus einer Theorie Sicht - strenge mathematische Spezifikation der Typentheorie und damit der Begriff "parametrischen Polymorphismus "hat eine strenge Definition. C++ - Vorlagen sind mehr ... flexibel als jede andere Theorie, die sie bieten könnte. Und somit ... vielleicht nützlicher! Sicherlich viel mehr _interessant_! Wie auch immer, ich habe immer C++ - Vorlagen gehört, die als "Ad-hoc-Polymorphismus" beschrieben wurden. – davidbak