Generika und Vorlagen (Visual C++)

Generika und Vorlagen sind beide Sprachfeatures, die Unterstützung für parametrisierte Typen bereitstellen.Es sind jedoch unterschiedlich und verfügen über unterschiedliche verwenden.Dieses Thema enthält eine Übersicht über die zahlreichen Unterschiede.

Weitere Informationen finden Sie unter Windows-Laufzeit und verwaltete Vorlagen (Komponentenerweiterungen für C++) und Übersicht über Vorlagen.

Vergleichen und Generika Vorlagen

Hauptunterschiede zwischen Generika und C++-Vorlagen:

  • Generika sind generisch, bis die Typen für sie zur Laufzeit ersetzt wurden.Vorlagen werden zur Kompilierzeit spezialisiert, sodass sie noch nicht parametrisierte Typen zur Laufzeit

  • Die Common Language Runtime unterstützt insbesondere Generika in MSIL.Da die Laufzeit in Generika auskennt, können bestimmte Typen für generische Typen ersetzt werden, wenn eine Assembly verweist, die einen generischen Typ enthält.demgegenüber lösen Vorlagen in gewöhnlichen Typen zur Kompilierzeit und die resultierenden Typen werden in anderen Assemblys nicht spezialisiert werden.

  • Das Generika, die in zwei verschiedenen Assemblys mit denselben Typargumenten spezialisiert ist, ist der gleiche Typ.Die Vorlagen, die in zwei verschiedenen Assemblys mit denselben Typargumenten spezialisiert sind, werden von der Laufzeit als unterschiedliche Typen betrachtet.

  • Generika wird als Einzelstück von ausführbarem Code generiert, der für alle Verweistyp Argumente verwendet wird (dies gilt nicht für Werttypen, die eine eindeutige Implementierung pro Werttyp haben).Der JIT-Compiler kennt in Generika und den Code für den Verweis oder Werttypen zu optimieren, das als Typargumente verwendet werden.Vorlagen generieren separaten Laufzeitcode für jede Spezialisierung.

  • Generika nicht zulässig. template <int i> C {}, z. B. TYPE-Vorlagenparameter KeineVorlagen ermöglichen es.

  • Generika lässt keine explizite Spezialisierung, d. h. die benutzerdefinierte Implementierung von einer Vorlage für einen bestimmten Typ).Master ausführen.

  • Generika lässt keine teilweise Spezialisierung (eine benutzerdefinierte Implementierung für eine Teilmenge der Typargumente).Master ausführen.

  • Generische Typen können nicht als Basisklasse für den generischen Typ Typparameter verwendet werden soll.Master ausführen.

  • Vorlagen unterstützungs-TEMPLATE (z. B. TEMPLATE-Parametertemplate<template<class T> class X> class MyClass), aber Generika jedoch nicht.

Kombinieren von Vorlagen und von Generika

  • Der wesentliche Unterschied zwischen von Generika hat Auswirkungen zum Erstellen von Anwendungen, die Vorlagen und Generika kombinieren.Angenommen, Sie haben eine Vorlagenklasse, dass ein generischer Wrapper für erstellen möchten, um diese Vorlage anderen Sprachen als generisches verfügbar zu machen.Sie können das einen generischen Typparameter nicht verwenden können, den sie anschließend über der Vorlage führt, da die Vorlage diesen Typparameter verfügen muss, jedoch zur Kompilierungszeit lösen das generische Typparameter nicht bis zur Laufzeit auf.Das Schachteln einer Vorlage in einem generischen funktioniert auch nicht, da es keine Möglichkeit gibt, die Vorlagen für beliebige generische Typen zur Kompilierungszeit zu erweitern, die zur Laufzeit instanziiert werden konnten.

Beispiel

sbh15dya.collapse_all(de-de,VS.110).gifBeschreibung

Das folgende Beispiel zeigt ein einfaches Beispiel für Generika und Vorlagen Anwendung zusammen.In diesem Beispiel wird die Vorlagenklasse den Parameter mit dem generischen Typ.Die Rückseite ist nicht möglich.

Diese Sprache kann verwendet werden, wenn Sie in einem vorhandenen generischen APIs mit Vorlagencode erstellen möchten, der an einer Visual C++-Assembly lokal ist, oder wenn Sie eine zusätzliche Ebene Parametrisierung einem generischen Typ hinzufügen, müssen bestimmte Features von Vorlagen genutzt werden nicht von Generika unterstützt.

sbh15dya.collapse_all(de-de,VS.110).gifCode

// templates_and_generics.cpp
// compile with: /clr
using namespace System;

generic <class ItemType>
ref class MyGeneric {
   ItemType m_item;

public:
   MyGeneric(ItemType item) : m_item(item) {}
   void F() { 
      Console::WriteLine("F"); 
   }
};

template <class T>
public ref class MyRef {
MyGeneric<T>^ ig;

public:
   MyRef(T t) {
      ig = gcnew MyGeneric<T>(t);
      ig->F();
    }    
};

int main() {
   // instantiate the template
   MyRef<int>^ mref = gcnew MyRef<int>(11);
}

sbh15dya.collapse_all(de-de,VS.110).gifOutput

F

Siehe auch

Weitere Ressourcen

Generika (Komponentenerweiterungen für C++)