Prüfen ob Klasse erbt:



  • moin354 schrieb:

    Ja, genau weil die Klasse B auch keinen Member X hat.
    Dein Programm überprüft dies zwar, jedoch wird es vom Compiler schon überprüft, bevor dein Programm ausgeführt wird.

    Dieses struct Konstrukt soll ja eben schon vom Compiler ausgewertet werden können (angeblich)



  • Die Struktur ist ja auch nicht das Problem, sondern der Aufruf der nicht vorhandenen Methode.



  • moin354 schrieb:

    Die Struktur ist ja auch nicht das Problem, sondern der Aufruf der nicht vorhandenen Methode.

    Wenn die struct vom compiler ausgewertet werden würde, würde es keinen Fehler geben. Dort steht nämlich ganz klar:

    if(B_erbt_von_A<B1,A1>::yes)
    t.X();

    Wenn der Compiler das B_erbt_von_A auswerten könnte - So wie der Prof es sagt - würde er wissen, dass t.X() gar nicht aufgerufen werden kann und somit keinen Fehler werfen.



  • Es ist dem Compiler egal. Schau mal dieses Beispiel ruft den selben Fehler hervor.

    class B1
    	{
    
    	};
    
    	B1 t;
    
    	if (0 == 1)
    		t.X();
    


  • Falls du den gcc hast kannst du ja mal das versuchen:

    SSA Aggressive Dead Code Elimination. Turned on by the `-fssa-dce' option. This pass performs elimination of code considered unnecessary because it has no externally visible effects on the program. It operates in linear time.

    (http://www.delorie.com/gnu/docs/gcc/gccint_30.html
    Ich weiß nicht, wie 'aggresiv' das ist.



  • @Jockelx
    Erstmal muss die Show als gültiges C++ übersetzbar sein. Dann wird optimiert.

    @RichardEb
    Du musst ein Hilfstempalte machen das X aufruft.
    Ala

    template <class T, bool = erbt_von<T, A>::value>
    struct XOderNix
    {
        static void X(T&) {}
    };
    
    template <class T>
    struct XOderNix<T, true>
    {
        static void X(T& t) { t.X(); }
    };
    
    // ...
    {
        B1 b;
        XOderNix<B1>::X(b);
    }
    


  • warum nicht einfach std::is_base_of verwenden?



  • kurze_frage schrieb:

    warum nicht einfach std::is_base_of verwenden?

    Auch gut.
    Der "is_base_of" Teil ist hier bloss nicht das Problem.
    Das Problem ist dass RichardEb nicht verstanden hat dass C++ (noch?) kein "static if" kann.



  • ich probiers noch mal

    RichardEb schrieb:

    //Edit: Der Befehl if(B_erbt_von_A<B1,A1>::yes) sollte angeblich schon zur Compilezeit ausgewertet werden und so Compilerfehler (wegen dem fehlenden 😵 verhindern)

    geht nicht std::is_member_pointer um festzustellen ob es eine Funktion X gibt?



  • Vielleicht.
    Ich frage mich nur was das mit der Fragestellung zu tun haben soll.
    Der OP hat erstmal primär ein ganz anderes Problem.


Anmelden zum Antworten