C++ Upcasting von Template Klasse
Verfasst: 28.07.2022, 19:59
Und gleich die nächste Frage :D
Ich habe eine Klasse, die einen Zeiter auf ein Objekt speichert und zurückgeben kann:
Die Idee ist, dass auch andere Node-Typen von Base erben können, die dann ggf. Werte berechnen. Input ist eine Klasse die einfach nur eine Konstante zurückgibt.
Nun habe ich sowas:
Ich habe also eine abstrakte Klasse für Funktionen und eine Spezialisierung für bestimmte Arten von Funktionen (hier eine die einfach konstant ist).
Nun funktioniert diese Zeile allerdings nicht, da die Typen nicht konvertiert werden können. Hätte ich hier nicht meine Input Klasse sondern einfach shared_ptr würde die Zuweisung funktionierenö das ist ja Up-Casting da Function1D::Constant von Function1D::Base erbt (Function1D::Base hat eine virtuelle get_value() Funktion, weshalb das ganze sinnvoll ist).
Jetzt frage ich mich, wie ich in meine Input Klasse Up-Casting Unterstützung einbauen kann. Am besten das es implizit funktioniert und die Zeile oben so gültig wird. Muss ja eigentlich ein geläufiges Problem sein, aber wie sieht das passende Pattern für die Lösung aus?
Ich habe eine Klasse, die einen Zeiter auf ein Objekt speichert und zurückgeben kann:
Code: Alles auswählen
// for each result type there is a different base class
template <typename t> class Base
{
public:
virtual shared_ptr<t> GenerateOutput() = 0;
};
template<typename t> class Input : public Base<t>
{
public:
Input(t value):
m_value(make_shared<t>(value))
{}
Input(shared_ptr<t> value):
m_value(value)
{}
virtual shared_ptr<t> GenerateOutput()
{
return m_value;
}
private:
shared_ptr<t> m_value;
};
Nun habe ich sowas:
Code: Alles auswählen
shared_ptr<Input<Function1D::Base>> fun = make_shared<Input<Function1D::Constant>>(0.2f);
Nun funktioniert diese Zeile allerdings nicht, da die Typen nicht konvertiert werden können. Hätte ich hier nicht meine Input Klasse sondern einfach shared_ptr würde die Zuweisung funktionierenö das ist ja Up-Casting da Function1D::Constant von Function1D::Base erbt (Function1D::Base hat eine virtuelle get_value() Funktion, weshalb das ganze sinnvoll ist).
Jetzt frage ich mich, wie ich in meine Input Klasse Up-Casting Unterstützung einbauen kann. Am besten das es implizit funktioniert und die Zeile oben so gültig wird. Muss ja eigentlich ein geläufiges Problem sein, aber wie sieht das passende Pattern für die Lösung aus?