extern Templates (C++0x)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu C++0x-Features - Index


Appmethod C++ 2009 beinhaltet die Verwendung von extern-Templates, die die Definition von Templates ermöglichen, die nicht in einer Übersetzungseinheit instantiiert werden. Durch extern-Templates wird sowohl die Compilierungsdauer als auch die Größe des compilierten Moduls reduziert. Dieses Feature ist Bestandteil des neuen C++0x-Standards.

Explizite Instantiierung und Deklaration

Eine extern-Template ermöglicht die Deklaration einer Template ohne deren Instantiierung in der Übersetzungseinheit.

Die beiden folgenden Codebeispiele erstellen und instantiieren jeweils eine Template:

template <class T>
class MyClass {
   //weiterer Code
}

template class MyClass<int>;
...
MyClass<int> myClass;

Die Zeile template class MyClass<int> ist eine explizite Template-Definition und bewirkt, dass die Template in dieser Code-Unit explizit instantiiert wird. Daraus ergibt sich die Erzeugung des Codes für die Template in dieser Unit. Die Zeile MyClass<int> myClass; instantiiert die Template implizit, was auch zur Erzeugung des Codes in der Unit führt. Wenn sich eine der beiden Zeilen in Ihrer Unit befindet, wird die Template hier instantiiert.

Angenommen, Sie möchten eine Bibliothek haben, in der alle Instantiierungen dieser Template enthalten sein sollen, und Sie möchten aus einer ausführbaren Datei heraus auf diese Instantiierungen verweisen. Um eine Template explizit zu deklarieren, ohne dass die Template in der Code-Unit instantiiert wird, verwenden Sie den folgenden Code:

extern template class MyClass<int>;

Sie können die Template dann referenzieren, aber der Compiler erzeugt in der Übersetzungseinheit keinen Code dafür.

Verwendung von extern-Templates

Im Folgenden finden Sie die Regeln für die Verwendung von extern-Templates:

  • Eine Template-Instantiierung muss entweder einer expliziten Template-Deklaration in dieser Übersetzungseinheit folgen oder sich in einer anderen Übersetzungseinheit befinden. Dies entspricht der üblichen Verwendung von extern: die referenzierte Entität muss irgendwo definiert sein.
  • Eine explizite Template-Definition darf nur einmal in einer Unit enthalten sein.
  • Eine explizite Template-Definition muss einer expliziten Template-Deklaration folgen, wenn sich beide in einer Übersetzungseinheit befinden.
  • Eine explizite Template-Deklaration kann nur für Namen von Objekten, Funktionen und expliziten Template-Instantiierungen angewendet werden. Sie darf nicht auf eine statische Funktion verweisen, darf aber für eine statische Member-Funktion angewendet werden.
  • Der Bezeichner extern darf nicht in Deklarationen von Klassen-Membern oder Parameteren verwendet werden.
  • Eine explizite Template-Deklaration unterdrückt die Codeerzeugung nur, wenn diese Template nicht mit derselben Spezialisierung instantiiert worden ist. Zum Beispiel:
template class MyClass<int>;
...
extern template class MyClass<int>;    // nicht zulässig
extern template class MyClass<float>;  // OK

Siehe auch