Vorlage Spezialisierung in C ++

Einige Vorlagen passen nicht zusammen ganz so leicht, wie man erwarten könnte, weil sie ein Konzept zum Ausdruck bringen, die nicht auf die gleiche Weise für jeden Datentyp nicht übersetzen. Zum Beispiel, wenn Sie stringify einen Datentyp in seine String-Darstellung unterscheidet sich die Technik, die auf Datentyp einzuschalten. Zum Beispiel, wenn Sie verwenden möchten stringify auf ein int, Sie könnten die folgende Vorlage verwenden:

#einschließen #einschließen using namespace std-template Inline-String stringify (const T Eingang) {Ostringstream Ausgang-Ausgang lt; lt; Eingabe-Rückkehr output.str () -} int main () {// Dieser Aufruf funktioniert wie expected.cout lt; lt; stringify(42) lt; lt; Endl - // Dieser Aufruf truncates.cout lt; lt; stringify(45,6789012345) lt; lt; Endl-return 0-}

Das stringify () Funktion akzeptiert einen beliebigen Datentyp und verwendet einfach ein ostringstream umwandeln Eingang zu a Schnur. Dieser Ansatz funktioniert für den ersten Aufruf fein in Main(), der ein int. Wenn jedoch der Code verwendet für eine doppelt, das Ergebnis abgeschnitten wird, wie hier gezeigt:

4245.6789

Sie können dieses Problem beheben, indem Hinzufügen von Spezialbehandlung für eine doppelt. Hier ist die modifizierte Form des Beispiels (wie gezeigt in StringifyDouble), Die Platz für eine doppelt.

#einschließen #einschließen #einschließen #einschließen 
using namespace std-template Inline-String stringify (const T Eingang) {Ostringstream Ausgang-Ausgang lt; lt; Eingabe-Rückkehr output.str () -} template lt;> Inline-String stringify (Const double Eingang) {ostringstream Ausgabe-const int sigdigits = numeric_limits:: Digits10-Ausgang lt; lt; setprecision (sigdigits) lt; lt; Eingabe-Rückkehr output.str () -} int main () {cout lt; lt; stringify(42) lt; lt; Endl-cout lt; lt; stringify(45,6789012345) lt; lt; Endl-return 0-}

Wenn Sie dieses Beispiel ausführen, sehen Sie das erwartete Ergebnis, da die doppelt Form der Vorlage verwendet setprecision zu ändern, die ostringstream Wert. Als Ergebnis sehen Sie die folgende Ausgabe:

4245,6789012345

Wie die Dinge mit C ++ heute sitzen, müssen Sie eine spezielle Vorlage für jeden Datentyp erstellen, die es erfordert. Theoretisch, wenn C ++ jemals bekommt ein Art der() Funktion können Sie den Datentyp erkennen und ein hinzufügen Schalter spezialisierte Verarbeitung innerhalb einer einzigen Vorlage auszuführen.

Das typeid () Funktion könnte als Ersatz für Arbeit Art der(), aber es ist herstellerspezifisch und nicht in jeder Version von C ++ implementiert. Wenn Sie die zu verwenden typeid () Funktion, stellen Sie sicher, dass Sie wissen, welche Compiler Ihre Organisation verwenden, um die Anwendung Code zu kompilieren.

Sie können auch die bemerkt haben in der Reihe Schlüsselwort für die Vorlage in diesem Beispiel. Das in der Reihe Stichwort teilt dem Compiler den Code von der Vorlage in Übereinstimmung mit dem Code erstellt zu versetzen, in dem es erscheint, und nicht aus der Reihe als separate Funktionsaufruf. In einigen Fällen, wie dies stringify () Funktion wird der Ergebniscode, der schneller ausführt.

Der Compiler ist nicht verpflichtet, mit dem nachzukommen in der Reihe Stichwort. Darüber hinaus wollen Sie Template-Code aus der Reihe gestellt, wenn er ein gewisses Maß an Instanziierung durchführen müssen, oder sie stellen keine kritischen Pfad-Code, der die Anwendung oft aufrufen können.

Menü