Was sind die Unterschiede zwischen C # Generika im Vergleich zu C ++ Templates? Ich verstehe, dass sie nicht genau dasselbe Problem lösen, also was sind die Vor- und Nachteile von beiden?
Sie können C ++ - Vorlagen als eine interpretierte, funktionale Programmiersprache betrachten, die als Generika-System getarnt ist. Wenn Sie das nicht erschreckt, sollte es:)
C # -Generika sind sehr eingeschränkt; Sie können eine Klasse für einen oder mehrere Typen parametrisieren und diese Typen in Methoden verwenden. Um ein Beispiel aus MSDN zu nehmen, könnten Sie Folgendes tun:
%Vor% Und jetzt können Sie ein Stack<int>
oder Stack<SomeObject>
deklarieren und es werden Objekte dieses Typs sicher gespeichert (dh, Sie müssen sich nicht sorgen, dass SomeOtherObject
versehentlich eingefügt wird).
Intern wird die .NET-Laufzeit es in Varianten für grundlegende Typen wie int und eine Variante für Objekttypen spezialisieren. Dadurch kann zB die Darstellung für Stack<byte>
viel kleiner sein als für Stack<SomeObject>
.
C ++ - Vorlagen ermöglichen eine ähnliche Verwendung:
%Vor%Das sieht auf den ersten Blick ähnlich aus, aber es gibt ein paar wichtige Unterschiede. Erstens gibt es statt einer Variante für jeden grundlegenden Typ und eine für alle Objekttypen eine Variante für jeden Typ, gegen den sie instanziiert wurde . Das können viele Arten sein!
Der nächste große Unterschied ist (bei den meisten C ++ - Compilern), dass er in jeder Übersetzungseinheit kompiliert wird, in der er verwendet wird. Das kann die Kompilierung sehr verlangsamen.
Ein weiteres interessantes Attribut für C ++ - Vorlagen ist, dass sie auf andere Dinge als Klassen angewendet werden können - und wenn dies der Fall ist, können ihre Argumente automatisch erkannt werden. Zum Beispiel:
%Vor%Der Typ T wird automatisch durch den Kontext bestimmt, in dem die Funktion verwendet wird.
Diese Attribute können auf Kosten Ihrer Gesundheit für gute Zwecke verwendet werden. Da eine C ++ - Vorlage für jeden Typ, für den sie verwendet wird, neu kompiliert wird und die Implementierung einer Vorlage dem Compiler immer zur Verfügung steht, kann C ++ sehr aggressiv in Templates eingebunden werden. Fügen Sie dazu die automatische Erkennung von Vorlagenwerten in Funktionen hinzu, und Sie können anonyme Pseudo-Funktionen erstellen in C ++ mit boost :: lambda . Also ein Ausdruck wie:
_1 + _2 + _3
Erzeugt ein Objekt mit einem ernsthaft beängstigenden -Typ, der einen Operator () hat, der seine Argumente addiert.
Es gibt viele andere dunkle Ecken des C ++ - Vorlagensystems - es ist ein extrem mächtiges Werkzeug, aber es kann schmerzhaft sein, darüber nachzudenken und manchmal schwer zu benutzen - besonders wenn es eine zwanzig Seiten lange Fehlermeldung gibt. Das C # -System ist viel einfacher - weniger mächtig, aber leichter zu verstehen und schwerer zu missbrauchen.
Grob gesagt hat ein großer Teil des Unterschieds damit zu tun, dass Vorlagen zur Kompilierungszeit aufgelöst werden und Generika zur Laufzeit aufgelöst werden.
Umfangreiche Antwort zu Stack Overflow: Was sind die Unterschiede zwischen Generics in C # und Java ... und Templates in C ++? ?
Dieser Blogeintrag von Eric Gunnerson deckt dieses Thema ziemlich gut ab.
Der größte unmittelbare Unterschied besteht darin, dass Vorlagen ein Kompilierzeitmerkmal sind, während Generika ein Laufzeitmerkmal sind.
Tags und Links c# c++ generics comparison templates