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?