Frage

Was sind einige praktische Anwendungen für die " Merkwürdiger Recurring Template Pattern "? Die „ Klasse gezählt “ Beispiel nur allgemein dargestellt ist kein überzeugendes Beispiel für mich.

War es hilfreich?

Lösung

Simulierte dynamische Bindung . Die Vermeidung der Kosten der virtuellen Funktion aufruft, während einige der hierarchischen Vorteile Halten ein enormer Gewinn für die Subsysteme ist, wo es im Projekt getan werden kann, Zur Zeit arbeite ich an.

Andere Tipps

Es ist auch besonders nützlich für die Mixins (womit ich meine Klassen, die Sie erben Funktionalität zur Verfügung zu stellen), die selbst wissen müssen, welche Art sie arbeiten (und müssen daher Vorlagen sein).

In Effective C ++ , stellt Scott Meyers als Beispiel eine Klassenvorlage NewHandlerSupport . Diese enthält eine statische Methode den neuen Handler für eine bestimmte Klasse (in der gleichen Weise, std :: set_new_handler macht für die Standard Bediener neu) außer Kraft zu setzen, und einen Operator, die die neue Handler verwendet. Um eine pro-Typ-Handler zur Verfügung zu stellen, muss die übergeordnete Klasse wissen, welche Art es handelt auf, so muss es sich um eine Klassenvorlage sein. Der Template-Parameter ist das Kind Klasse.

Sie können nicht wirklich tun dies ohne CRTP, da Sie die NewHandlerSupport Vorlage müssen separat instanziiert werden, mit einer separaten statischen Datenelement den aktuellen new_handler zu speichern, pro Klasse, die es verwendet.

Offensichtlich ist das ganze Beispiel ist extrem nicht-Thread-sicher, aber es zeigt den Punkt.

Meyers legt nahe, dass CRTP gedacht werden könnte als "Do It For Me". Ich würde sagen, dies in der Regel der Fall für jede mixin ist, und CRTP gilt für den Fall, dass Sie eine mixin Vorlage benötigen und nicht nur eine mixin Klasse.

Die CRTP bekommt viel weniger neugierig, wenn Sie, dass die Unterklasse Art betrachten, die auf die übergeordneten Klasse übergeben wird nur zum Zeitpunkt der Methode Expansion benötigt wird. So dann werden alle Arten definiert. Sie müssen nur das Muster den symbolischen Unterklasse-Typen in die übergeordneten Klasse importieren, aber es ist nur eine Vorwärtsdeklaration - wie alle formalen Vorlagen param Typen per Definition -. Soweit die übergeordneten Klasse betrifft

Wir verwenden in etwas abgewandelter Form, die Unterklasse in einer Struktur Züge Typ der übergeordneten Klasse es möglich, dass die übergeordnete Klasse Objekte der abgeleiteten Art zurückkehren zu machen vorbei. Die Anwendung ist eine Bibliothek für geometrische Calculus (Punkte, Vektoren, Linien, Rechtecke), in der alle die generische Funktion in der übergeordneten Klasse implementiert ist, und die Unterklasse definiert, nur eine spezifische Art: CFltPoint von TGenPoint erbt. Auch gab es CFltPoint vor TGenPoint, so Subklassifizieren war ein natürlicher Weg, dies zu Refactoring.

Generell ist es für polymorphe artige Muster verwendet, in denen Sie nicht brauchen, um die Lage sein, die abgeleitete Klasse zur Laufzeit zu wählen, nur bei der Kompilierung. Dies kann den Overhead der virtuellen Funktionsaufruf zur Laufzeit speichern.

Für eine reale Bibliothek Verwendung von CRTP, Blick auf ATL und WTL (wtl.sf.net). Es wird weitgehend dort für Kompilierung-Polymorphismus verwendet.

Es fühlt sich ein bisschen wie C-Makro. Nimmt Vorteil, dass das Makro nicht zum Zeitpunkt der Definition kompiliert wird, aber zum Zeitpunkt der Nutzung

#define CALL_THE_RIGHT_FOO foo()

Datei A:

static void foo() {
   // do file A thing
}
...
CALL_THE_RIGHT_FOO
...

Datei A:

static void foo() {
   // do file B thing
}
...
CALL_THE_RIGHT_FOO
...

Die Vorlage Nutzungsmuster Sie beschreiben, ermöglicht es uns, „rufen die richtig foo“ in der übergeordneten Vorlage zu tun, die Verschiebung die Definition das, was genau die richtig foo ist, bis die Vorlage instanziiert wird. Außer in diesem Fall ist es die Unterscheidung zwischen KlasseA :: foo und ClassB :: foo basierend auf dem Wert von T in Parent.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top