Vorgehensweise zur Umgehung der Einschränkung, dass Elementfunktionen mit Vorlagen nicht virtuell sein können

Ich stoße auf ein Designproblem, bei dem ich (in C ++) möchte, dass eine Member-Funktion mit Vorlagen (einer Nicht-Template-Klasse) virtuell ist, und frage mich, ob es eine gute und elegante Möglichkeit gibt, das Problem zu umgehen.

Das Szenario geht, ich habemaschinen Dasverarbeiten generischArtikel. Ich benutze eine abstrakte Basisklasse fürmaschinen mit einem virtuellenProzess (Item) Funktion, so dass jede Maschine ihre eigene einzigartige Verarbeitungsmethode definieren kann. Das Problem ist, dass die Elemente auch insofern "allgemein" sind, als sie bestimmte Schnittstellen für die Art und Weise offenlegen, wie sie verarbeitet werden können. Aus Gründen (hauptsächlich aus Gründen der Leistung ... ohne Overhead für die virtuelle Tabelle) möchte ich für diese Elemente den Polymorphismus zur Kompilierungszeit verwenden. Damit jetzt jede Maschine eine Schnittstelle wie:

class Machine
{ public:
    template <typename T>
    virtual void process(T& item) = 0; 
};

Dies ist jedoch in C ++ nicht möglich, da Member-Funktionen mit Vorlagen nicht virtuell sein können. Natürlich kann ich die Maschinenklasse als Vorlage für den Elementtyp T definieren, aber dies bereitet mir im größeren Entwurfsschema mehr Kopfschmerzen, und wirklich hängt kein anderer Teil der Maschinenklasse von dem Element ab. Dies ist nur ein Argument für die process () - Funktion .

Gibt es einen besseren Weg, um dies zu umgehen, oder Vorschläge, wie diese generische Familie von Computern bereitgestellt werden kann, die eine Familie generischer Elemente verarbeiten (wobei die Elemente einen Polymorphismus zur Kompilierungszeit verwenden)? Bin ich am Ende in Bezug auf mein Design.

Schätzen Sie alle Vorschläge

Antworten auf die Frage(1)

Ihre Antwort auf die Frage