Typvergleich VCL-Klasse & C++ Templateargument



  • Ich muss in einer Templatefunktion herausfinden, ob ein Control von dem im template angegebenen VCL-Typ ist. Da RTTI nach meinem Wissen mit VCL-Typen nicht unproblematisch funktioniert (typeid & Co), wollte ich Fragen wie man einen solchen Vergleich machen kann.

    Sehr vereinfacht dargestellt:

    template<
        typename object_type>
    bool IstGleicherTyp(TObject * objekt)
    {
        return // Typ von object == Typ von object_type
    }
    


  • Wenn Du nur einen Basisklassenzeiger auf TObject hast, geht's nicht mit Templates. Templates betrachten den statischen Typ, hier TObject und nicht den Typ, der wirklich hinter dem Zeiger liegt.
    Aber warum nicht einfach objekt->ClassName() befragen?
    http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System__TObject__ClassName.html



  • Sollte hier nicht ein schlichter dynamic_cast reichen wenns zur Laufzeit sein soll?

    template<
        typename object_type>
    bool IstGleicherTyp(TObject * objekt)
    {
        return dynamic_cast<object_type*>(objekt) != 0;
    }
    

    Das testet natürlich nicht auf den genauen Typ. Für alle von object_type abgeleiteten Klasse gibt das ja auch true zurück.



  • Wenn du wirklich die Identität der beiden Typen überprüfen willst, geht das so:

    template <typename ObjT>
        bool delphiTypeIsEqual (TObject* obj)
    {
        return obj->ClassType () == __classid (ObjT);
    }
    

    Aber meistens ist das, was du willst, eher der dynamic_cast<>() .

    @volkard: Man könnte auch den ClassName() vergleichen - aber es kann schon mal vorkommen, daß es zwei Klassen gleichen Namens im Programm gibt.



  • Erstmal Danke...

    audacia schrieb:

    Aber meistens ist das, was du willst, eher der dynamic_cast<>() .

    In diesem Fall nicht (einmal geht es mir hier um den genauen Typ, zum anderen benötige ich diese Information nicht, um mit dem Objekt weiter zu arbeiten).


Log in to reply