2016-04-29 25 views
10

Nach der Wikipedia-Seite für Parametric Polymorphism:Warum soll C++ parametrischen Polymorphismus nicht unterstützen?

Einige Implementierungen von Typ Polymorphismus sind parametrischer Polymorphismus oberflächlich ähnlich, während auch Ad-hoc-Aspekte einzuführen. Ein Beispiel ist die C++ Template-Spezialisierung.

Frage: Warum ist C++, sagte nur etwas oberflächlich ähnlich zu implementieren Polymorphismus paramaterized? Insbesondere sind Vorlagen kein Beispiel für einen vollständigen parametrischen Polymorphismus?

+0

Unabhängig von der Antwort auf diese Frage, die Wikipedia-Seite braucht viel Liebe ... – Barry

+1

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

Antwort

1

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.

1

Der Artikel, mit dem Sie verlinkt sind, erklärt dies. Genau der Text, den Sie zitiert haben, gibt ein Beispiel für etwas, das C++ - Templates von reinem parametrischem Polymorphismus unterscheidet: C++ - Template-Spezialisierung.

Es zu diesem Thema weiter:

Christopher Strachey Folgen, [2] parametrischer Polymorphismus mit ad hoc polymorphism werden gegenübergestellt, in denen eine einzige polymorphe Funktion in Abhängigkeit einer Anzahl von unterschiedlichen und möglicherweise heterogene Implementierungen haben kann über die Art der Argumente, auf die es angewendet wird. Daher kann Ad-hoc-Polymorphismus im Allgemeinen nur eine begrenzte Anzahl solcher unterschiedlichen Typen unterstützen, da für jeden Typ eine separate Implementierung bereitgestellt werden muss.

Somit kann, wie beschrieben, C++ templates nahe kommen — sind aber nicht genau — parametrischer Polymorphismus.