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 von dynamic_cast<> benutzen.


Log in to reply