Dynamic cast durch CRTP ersetzbar?
-
Hallo,
ich bin dabei benutzerdefinierte Manipulatoren fuer meine eigene Klassen zu schreiben (sich an Stroustrup 21.4.6.3 orientierend). Ich habe zwei Klassentemplates auf deren Grundlage ich dann die eigentlichen Manipulatoren definiere:
template<class T, class M> class Base_Manip { public: virtual void dummy() {} Bound_Base_Manip<T, M> operator()(const T* n) const { return Bound_Base_Manip<T, M>(*(dynamic_cast<const M*>(this)), n); } // ????? }; template<class T, class M> class Bound_Base_Manip { private: const M& m_manip; const T* m_data; public: Bound_Base_Manip(const M& bm, const T* t) : m_manip(bm), m_data(t) { } const M& manip() const { return m_manip; } const T* data() const { return m_data; } };
Ein Manipulator sieht dann z.B. so aus (Rev_Nd ist eine meiner Klassen):
class Rev_Nd_Manip : public Base_Manip<Rev_Nd, Rev_Nd_Manip> { friend ostream& operator<<(ostream& s, const Bound_Base_Manip<Rev_Nd, Rev_Nd_Manip>& bm); private: int m_level; public: explicit Rev_Nd_Manip(int level) : m_level(level) { } int level() const { return m_level; } };
Das Ganze funktioniert so, aber ich frage mich, ob man die mit '?????' gekennzeichnete Zeile mittels CRTP (oder einem anderen Konstrukt) umschreiben kann (und sollte)?
-
Du könntest einfach
static_cast<>
anstelle vondynamic_cast<>
benutzen.