2017-06-29 7 views
1

Exportvorlagen sind ein Feature in C++ vor 2011, bei dem die Implementierung einer Vorlage auf eine separate Quelldatei verschoben wurde.Wie werden Exportvorlagen implementiert?

According to this article, ist es möglich, "manuelle" Exportvorlagen über manuelle Angabe für jeden in der Implementierungsdatei verwendeten Typ zu schreiben. Da dies einfach spezifische Symbole erzeugen würde - ich glaube ähnlich wie überladene Funktionen - macht es Sinn, wie dies umgesetzt werden würde.

Aber es ist mein Verständnis, dass eine exportierte Vorlage (über das export Schlüsselwort) beliebig ist. Es kann jede Art von Daten übergeben werden.

dieses einfache Beispiel:

template<typename T> 
T add(T value1, T value2) { 
    return value1 + value2; 
} 

Die Ausgabebaugruppe für dieses Beispiel würden wild unterscheiden, wenn T ein int ist, ein float, oder insbesondere ein std::string (und jede andere Art, die die + Ladene Operatoren).

Da es völlig willkürlich ist, wie würde ein Compiler dieses Schlüsselwort implementieren?

Meine Vermutung ist Code-Generierung bei Link-Zeit, die höchstwahrscheinlich ein benutzerdefiniertes Objekt Dateiformat erfordern würde, enthält einige Darstellung des Codes. Aber das macht den Linker auch zu einem Compiler, der die Preprocessor-Compiler-Linker-Trennung unterbricht.

Antwort

0

Vorlagen werden nur in die konkreten Typen instanziiert, wenn sie durch den zu kompilierenden Code bezeichnet werden.

An diesem Punkt benötigt der Compiler alle Informationen (Strukturdefinitionen, Funktionsdefinitionen), um den Code zu generieren.

Wenn die einzige Definition der Compiler sieht, wenn eine Struktur zu importieren ist

export templat<...> class foo; 

Es hat keinen Mechanismus, um den Code zu generieren und schlägt fehl, wenn Merkmale der Klasse foo angefordert werden.

Umgekehrt stehen beim Erstellen einer Bibliothek die Definition und die Implementierung dem Compiler zur Verfügung, aber es kann nicht sehen, welche Typen von der Bibliothek verwendet werden können.

Der einzige (benötigt?) Mechanismus, der verfügbar ist, ist eine Header-Datei. Dies hat die Definition und Implementierung und vermeidet die Notwendigkeit für ein spezielles Objektformat.

Wenn Sie konkrete Beispiele Ihrer Vorlage explizit instanziieren, können diese aus einer Bibliothek exportiert werden, jedoch nur für vorbekannte Typen.

1

Um 2001 implementierte EDG export, und Comeau stellte mir einen frühen Build zur Verfügung. Ich konnte tatsächlich A<B<A<B<A<int> > > > > instantiieren, wobei A<T> in A.cpp definiert war und B<T> in B.cpp definiert war. Offensichtlich erfordert dies eine Art von Link-Time-Code-Generierung.

Das war noch erstaunlicher, weil Comeau tatsächlich MSVC als Back-End verwendete, während Microsoft gleichzeitig argumentierte, dass dies unmöglich sei! (Deshalb habe ich export an erster Stelle, WG21 Papier N1426)

ausgewertet
Verwandte Themen