Template-Klasse - Verständnisproblem



  • Guten Tag,

    mein Professor hat letztens den unterstehenden Quelltext an die Leinwand geworfen. Allerdings verstehe ich nicht wie die Template-Klassen ineinander arbeiten... Könnt ihr mir weiterhelfen?
    Vielen Dank

    #include <iostream>
    
    using namespace std;
    
    template <int n> struct Z{
    	enum{s = n + Z<n-1>::s};
    };
    
    template <> struct Z<1>{
    	enum {s=1};
    };
    
    void main(void){
    	cout << Z<5>::s << endl;
    }
    


  • Es handelt sich nicht um eine Template-Klasse, sondern um eine Klassen-Template bzw. Klassenvorlage. Es ist erstaunlich, wie oft man darauf hinweisen muss; scheinbar lehrt niemand das richtig.

    Also, Z ist eine Klassenvorlage, Z<5> eine aus ihr konkretisierte Klasse. Z<5> bezieht sich in ihrer Definition auf Z<4> (in Form von Z<n-1>), Z<4> auf Z<3> und so weiter, bis Z<1> erreicht wird, für die eine besondere Spezialisierung existiert, die statt der allgemeinen Form benutzt wird (damit endet die Rekursion). Dies sind alles verschiedene (!) Klassen, die sich wie alle anderen Klassen gegenseitig verwenden können und den gleichen Regeln unterliegen.

    Übrigens ist

    void main(void)
    

    nicht standardkonform; main muss int zurückgeben. Garantiert ist im Standard, dass

    int main();
    int main(int argc, char *argv[]);
    

    und äquivalente Formen funktionieren; alles andere ist mehr oder weniger Glückssache.


  • Mod

    Stichwort Rekursion: Z<5> nutzt Z<n-1>, also Z<4>. Z<4> nutze Z<3>, ..., Z<2> nutzt Z<1>, Z<1> nutzt HALT STOPP! Z<1> ist spezialisiert, Z<1> nutzt gar kein anderes Z. Und das ist auch gut so, wenn die Rekursion ewig weitergehen würde, wie sollte dann jemals etwas herauskommen. Und nun geht's wieder rückwärts: Bei Z<1> ist einfach s=1. Z<2>::s ist daher 2 + Z<1>::s = 2 + 1 = 3. Z<3>::s ist daher 3 + Z<2> = 3 + 3 = 6, usw.



  • dankeschön für die erklärungen, das hat mich weitergebracht 🙂



  • C++ Templates werden oft an der Uni ale Beispiel genommen, weil sie an sich eine Turing Complete Progirammiersprache sind ( Das ist auch mathematisch bewiesen ).

    Diese "Template Programme" wie in deinem Beispiel werden nicht zur Laufzeit, sonder zur Kompilierungszeit ausgeführt - man missbraucht den C++ Compiler zu einem Intepreter.

    In der Praxis werden in dieser Art und Weise Templates selten verwendet, aber aus theoretischer Sicht ist dieses Nebeneffekt natürlich sehr interessant.



  • Hasenschablone oder Schablonenhase?


Anmelden zum Antworten