Explizite Instanziierung – wann wird sie verwendet?

Nach einigen Wochen Pause versuche ich, mein Wissen über Templates mit dem Buch Templates – The Complete Guide von David Vandevoorde und Nicolai M. Josuttis zu erweitern und zu erweitern, und was ich in diesem Moment zu verstehen versuche, ist die explizite Instanziierung von Templates .

Ich habe eigentlich kein Problem mit dem Mechanismus als solcher, aber ich kann mir keine Situation vorstellen, in der ich diese function nutzen möchte oder möchte. Wenn mir jemand das erklären kann, werde ich mehr als dankbar sein.

Direkt kopiert von http://msdn.microsoft.com/en-us/library/by56e477%28VS.80%29.aspx :

Mit der expliziten Instanziierung können Sie eine Instanziierung einer Vorlagenklasse oder -funktion erstellen, ohne sie tatsächlich in Ihrem Code zu verwenden. Da dies nützlich ist, wenn Sie Bibliotheksdateien (.lib) erstellen, die Vorlagen für die Verteilung verwenden, werden nicht abgeschlossene Vorlagendefinitionen nicht in Objektdateien (OBJ) abgelegt.

(Zum Beispiel enthält libstdc ++ die explizite Instanziierung von std::basic_string,allocator > (was std::string ), also jedes Mal, wenn Sie functionen von std::string , dieselbe function Code muss nicht in Objekte kopiert werden, der Compiler muss diese nur auf libstdc ++ verweisen (verlinken).)

Wenn Sie eine Vorlagenklasse definieren, die Sie nur für einige explizite Typen verwenden möchten.

Setzen Sie die Template-Deklaration wie eine normale class in die Header-Datei.

Setzen Sie die Vorlagendefinition in eine Quelldatei wie eine normale class.

Am Ende der Quelldatei instanziieren Sie explizit nur die Version, die verfügbar sein soll.

Dummes Beispiel:

 // StringAdapter.h template class StringAdapter { public: StringAdapter(T* data); void doAdapterStuff(); private: std::basic_string m_data; }; typedef StringAdapter StrAdapter; typedef StringAdapter WStrAdapter; 

Quelle:

 // StringAdapter.cpp #include "StringAdapter.h" template StringAdapter::StringAdapter(T* data) :m_data(data) {} template void StringAdapter::doAdapterStuff() { /* Manipulate a string */ } // Explicitly instantiate only the classes you want to be defined. // In this case I only want the template to work with characters but // I want to support both char and wchar_t with the same code. template class StringAdapter; template class StringAdapter; 

Main

 #include "StringAdapter.h" // Note: Main can not see the definition of the template from here (just the declaration) // So it relies on the explicit instantiation to make sure it links. int main() { StrAdapter x("hi There"); x.doAdapterStuff(); } 

Es hängt vom Compiler-Modell ab – anscheinend gibt es das Borland-Modell und das CFront-Modell. Und dann kommt es auch auf Ihre Absicht an – wenn Sie eine Bibliothek schreiben, können Sie (wie oben erwähnt) die gewünschten Spezialisierungen explizit instantiieren.

Die GNU c ++ Seite diskutiert die Modelle hier https://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/Template-Instantiation.html .