Gibt es ein "isoftype<>" in C++?



  • Gibt es ein "isoftype<>" in C++?



  • Meinst du sowas wie typeid bzw. dynamic_cast?



  • Nein, ich möchte prüfen, ob ein Objekt von einem bestimmten Typ ist. Das ist doch einer Hauptfunktionen von RTTI, oder?



  • "eine der Hauptfunktionen" wollte ich sagen!



  • typeid liefert eine Struktur mit den nötigen Vergleichsinformationen. Aber für deine Zwecke mag auch "if(dynamic_cast<X>(val)!=NULL) cout<<"Typ stimmt";" ausreichen.



  • CS schrieb:

    typeid liefert eine Struktur mit den nötigen Vergleichsinformationen. Aber für deine Zwecke mag auch "if(dynamic_cast<X>(val)!=NULL) cout<<"Typ stimmt";" ausreichen.

    Das macht den Code völlig unlesbar!

    Wenn schon, dann so:

    template < typename targetType, class sourceType > inline bool is_of_type( sourceType arg1 ) {
       return dynamic_cast < targetType > ( arg1 ) != 0;
    }
    
    if ( is_of_type < A* > ( b ) ) ...
    

    Warum ist das in der <algorithm> Library nicht drin?



  • isoftype schrieb:

    CS schrieb:

    typeid liefert eine Struktur mit den nötigen Vergleichsinformationen. Aber für deine Zwecke mag auch "if(dynamic_cast<X>(val)!=NULL) cout<<"Typ stimmt";" ausreichen.

    Das macht den Code völlig unlesbar!

    Wenn schon, dann so:

    template < typename targetType, class sourceType > inline bool is_of_type( sourceType arg1 ) {
       return dynamic_cast < targetType > ( arg1 ) != 0;
    }
    
    if ( is_of_type < A* > ( b ) ) ...
    

    Klar kannst du das auch machen, wenn es dich glücklich macht. Oder du schreibst:

    #define is_of_type(x,y) dynamic_cast<y>(x) != 0
    
    if( is_of_type(b,A*) ) ...
    

    (ist noch kürzer, aber nicht ganz so sauber

    Warum ist das in der <algorithm> Library nicht drin?

    Vermutlich weil niemand das für nötig gehalten hat 😉
    (afaik gibt es bei MFC einen ähnlichen Mechanismus, aber nagel mich nicht darauf fest)



  • isoftype schrieb:

    Warum ist das in der <algorithm> Library nicht drin?

    Weil man es eigentlich nie braucht. Wozu braucht man das denn? Damit eine Basisklasse ihre abgeleiteten Typen benennen kann? Das ist genau der falsche Einsatz von Vererbung und Polymorphie. In den vergleichsweise wenigen Szenarien, wo ein dynamic_cast gerechtfertigt ist, sollte man diesen auch in seiner vollen Hässlichkeit hinschreiben (müssen).



  • 7H3 N4C3R schrieb:

    Wozu braucht man das denn?

    Z.B. ich habe einen Typunabhängigen Container über eine reine virtuelle Basisklasse erzeugt, und möchte den Container bearbeiten, z.B. es ist ein Baum, und ich möchte den Baum parsen und den Typ der Objekte prüfen können, ohne eine Methode in die reine virtuelle Basisklasse einzufügen, die dann überall implementiert sein muss.



  • isoftype schrieb:

    Z.B. ich habe einen Typunabhängigen Container

    Macht man in 90% der Fälle mit Templates.

    isoftype schrieb:

    über eine reine virtuelle Basisklasse erzeugt, und möchte den Container bearbeiten, z.B. es ist ein Baum, und ich möchte den Baum parsen und den Typ der Objekte prüfen können, ohne eine Methode in die reine virtuelle Basisklasse einzufügen, die dann überall implementiert sein muss.

    Ich sehe nicht wieso da nicht eine pure virtuelle Methode und ein Upcast reichen, ja sogar eleganter sind.



  • Wenn Du ein Kompositum hast und mit einem Besucher drüber laufen willst, dann ist das gerade so eine Situation, wo der Einsatz gerechtfertigt sein kann.

    Allerdings

    if ( is_of_type < A* > ( b ) )

    if ( dynamic_cast < A*> ( b ) )

    Fällt Dir was auf? 🙂 Durch den impliziten cast eines Pointers nach bool, löst sich die Notwendigkeit für ein "isoftype" in Luft auf.



  • Das ist aber eine Zweckentfremdung von dynamic_cast<>.

    Ein is_of_type<> ist da viel deutlicher.


Anmelden zum Antworten