Hinweis: Die folgende Frage bezieht sich auf Template Method Design Pattern und C++ - Funktionsvorlagen. Um beide zu unterscheiden, werde ich kursiv verwenden, wenn Sie auf das Entwurfsmuster verweisen, und fett, wenn Sie auf C++ - Vorlagen verweisen.Implementieren Vorlagenvorlage Methode
Die Idee der Vorlage Methode Muster ist, Teile eines Algorithmus austauschbar zu machen. Dies wird normalerweise durch Vererbung erreicht, wobei die Unterklasse konkrete Implementierungen bereitstellt, die in einen Algorithmus der Basisklasse eingesteckt werden. Wenn die Hook-Methoden jedoch Vorlagen sein müssen, funktioniert dies nicht, da Vorlagen nicht virtuell sein können. Hier ist ein einfaches Beispiel, das nicht kompilieren lässt:
class Base
{
public:
// This is the template method
template <typename T>
void doSomething(T input)
{
//...
auto converted = ConvertInput(input);
//...
std::cout << converted;
}
protected:
//compile error "member function templates cannot be virtual"
template <typename T>
virtual T ConvertInput(T input) = 0;
};
class Derived : public Base
{
protected:
template <typename T>
T ConvertInput(T input)
{
return 2 * input;
}
};
int main()
{
Derived d;
d.doSomething(3);
}
Gibt es eine Möglichkeit Vorlage Methoden die Funktionsschablone Haken verwenden zu implementieren?
Ich bin nicht daran interessiert, die Base
Klasse als Typ irgendwo zu verwenden. Ich werde immer den konkreten Typ verwenden, um eine maximale Kompilierzeitoptimierung zu erreichen. Also eine andere Formulierung dieser Frage ist: Wie kann ich mehrere Klassen Derived-1 .. Derived-n
erstellen, die Funktionsvorlagen haben, die ein gemeinsames Code-Skelett über die Implementierungen teilen?
[CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). Nehmen wir an, dass 'Base'' Derived' als Template-Parameter verwendet. Call 'ConvertInput' via' static_cast (this) -> ConvertInput' –
Gibt es eine Beschränkung für die Menge der für 'T' verwendeten Typen? – Yakk
@Yakk Ja, aber nur implizite. Z.B. Eine Instanz davon benötigt Iteratoren, was alles sein kann. –