Ist das Besucher-Muster der schnellste Weg, Methoden-Typidentifikation (effektiv single dispatch auf einem Parameter, nicht die Klasse eines Mitglieds) in C ++ zu erreichen? Ich könnte die genaue (n) Methode (n) kennen, die ich auf Elemente des noch nicht bekannten Subtyps aufrufen möchte, so dass immer ein zusätzlicher virtueller Methodenaufruf wie V::visit(A *)
in A::accept(V &v) { v.visit(this); }
unerwünscht ist.
Ich hätte gerne etwas funktionelles Äquivalent wie folgt, aber mit O (1) Kosten, was AFAIK nicht möglich ist mit dynamic_cast & lt; & gt; oder typeid () Leitern, da std::type_info
kein conexpr / schaltbar sein kann.
Was sind meine Möglichkeiten hier? Danke für den Rat!
Bearbeiten: Geänderter Beispielcode zum Eingeben von Ergebnissen über Feld, sodass mehrere Signaturen für verschiedene Methodentypen nicht benötigt werden. Danke, Maurice!
Endgültige Entscheidung: Abgesehen davon, dass ich die obligatorischen doppelten Versandkosten des Besuchermusters nicht mochte, wollte ich auch das Interface Bloat des Überladens von foo()
vermeiden, aber das glaube ich nicht ist ein bekanntes sauberes Muster, um dies zu tun. Ich habe gerade statische Überladungen gemacht und es als Tag bezeichnet. Wie auch immer, meine Absicht, das Überladen innerhalb einer Funktion einzukapseln, ist bestenfalls ein fragwürdiges Ziel. Danke, Maurice für die Antwort.
Tatsächlich müssen die Schnittstellen nicht dupliziert werden. Die Unterklassen des Besuchers können die Details der Operation behandeln. In Ihrem Fall:
%Vor%Also wird nur eine accept () Methode in jeder Klasse benötigt.
Alle Alternativen zu dem Besuchermuster, die ich mir vorstellen kann, beinhalten eine Art Laufzeitsuche, also ja, IMHO, das Besuchermuster ist der schnellste Weg.
Tags und Links c++ oop visitor-pattern dynamic-dispatch