Ein Visitor.

Wie in der Literatur zum Visitor Pattern zu lesen ist, hat der Visitor immer eine recht zwiespältige Resonanz gehabt. Einerseits zur Reduktion von Übersetzungszeiten gedacht eine Hilfe im Kampf gegen ständiges Übersetzen der gesammten Klassenhierarchie bei Aufnahme einer neuen virtuellen Methode in der Basisklasse, wird er selbst zum Problem bei hinzufügen einer neuen Klasse (vgl. GoF, Alexandrescu et al.).

Diese Implementierung nutzt den template Trick der verzögerten Instanzierung um dem Problem des Visitor beizukommen. Sie stellt damit eine Synthese von Robert Martins dynamischen Cast und andererseits von Barton und Nackmans Mixin dar. Der Trick wird von mir als "deferred downcast" bezeichnet...

Eine Grafik:

Ansonsten ist die Implementierung recht konventionell. Eine normalerweise direkt von der Basisklasse (hier : DocElement) abgeleitete Klasse wird nun immer von einem Visitoracceptor abgeleitet. Dieser stellt den typsicheren Downcast im Accept bereit. Als template Klasse wäre keine weitere Implementierung erforderlich (also keine zweite Hierarchie wie bei Martin) wenn nicht einige Compiler am Markt bei templates noch Nachhilfe bräuchten. Dies wird ggf. mit einem Macro realisiert, hinter dem sich eine vollständige Spezialisierung des Accept Template verbirgt.

Die Visitor Klasse ist auf ein Grundgerüst abgemagert. Nur noch der virtuelle Destruktor und die Typen des Rückgabewertes sowie der eigentlichen Basisklasse sind vorhanden. Hier erfolgt der zweite typsichere Downcast bei diesem Idiom in den Implementierungen.

Ansonsten wurde mit einem Adapter Pattern bei den Visitor Klassen die Implementierung entkoppelt. Damit sind entgegen den üblichen Implementierungen die Visitoren selbst nicht mehr so empfindlich bei Einfügen einer neuen Klasse und ein recompile entfällt weitgehend.

Der Testtreiber wurde unter GNU gcc 3.0 und Visual C++ 6.0 getestet.

Quellcode:

zip 1.0.1

tar gzip 1.0.1