Fragte zur Funktionsweise von Loki (rekursive meta-programmierung mittel partieller template spezialisierung)



  • Ein Stück code:

    template <class TList, unsigned int index> struct TypeAt;
    
    template <class Head, class Tail>
    struct TypeAt<Typelist<Head, Tail>, 0>
    {
        typedef Head Result;
    };
    
    template <class Head, class Tail, unsigned int i>
    struct TypeAt<Typelist<Head, Tail>, i>
    {
        typedef typename TypeAt<Tail, i - 1>::Result Result;
    };
    

    In der 2. partiellen Spezialisierung steht folgende Zeile:

    typedef typename TypeAt<Tail, i - 1>::Result Result;
    

    Was wird da aufgerufen? Das erste template? Wenn ja, womit wird das struct gefült? Mit nix kann ja net sein, dann gäbe es ja kein Result! Das letzte hätte ja sinn, aber da stimmt ja die Parameterzahl net!



  • Die Antwort lautet 42... 😃

    PS
    Machst Du das irgendwie beruflich - das ist ja Krank! 😮



  • Hallo,
    das ist nicht krank sondern für viele nur etwas ungewohnt.

    Zu der Frage:

    typedef typename TypeAt<Tail, i - 1>::Result Result;

    Was wird da aufgerufen? Das erste template? Wenn ja, womit wird das struct gefült? Mit nix kann ja net sein, dann gäbe es ja kein Result! Das letzte hätte ja sinn, aber da stimmt ja die Parameterzahl net!

    Eine Typelist hat immer die Struktur Typelist<Head, Tail> wobei Tail entweder NullType oder aber wieder eine Typelist<Head, Tail> ist.
    Damit sollte auch klar sein, wieseo die Parameteranzahl genau richtig ist.
    Rufst du TypeAt z.B. mit einer einelementigen Typelist und einem Index 0 auf,
    dann passt die erste Spezialisierung.

    Hat deine Typelist n Elemente und du rufst TypeAt mit Index m auf (m < n), dann wird die zweite Spezialisierung verwendet (da i != 0).
    Dort wird der Kopf der Liste entfernt und der Aufruf rekursiv mit dem Tail der Liste und einem ums eins verringerten Index weitergeführt.
    Der Tail der Liste hat aber wie gesagt wieder die Struktur Typelist<Head, Tail>, kann also selbst wieder in einen Kopf und einen Rest zerlegt werden.
    Damit passt erneut die zweite Spezialisierung.
    Die zweite Spezialisierung sagt ja nicht: ich erwarte drei Parameter sondern ich erwarte zwei Parameter wobei der erste Parameter die Struktur Typelist<Head, Tail> besitzen soll.
    Ein T = Typelist<int, Typelist<double, Typelist<short, NullType> > > passt also auf diesen Parameter und Head wird zu int und Tail zu Typelist<double, Typelist<short, NullType> > hergeleitet.



  • @HumeSikkins: Mich erstaunt immer wieder, was c++ als nette und zuvorkommende Sprache für mich tut 😃 (So ungefähr hab ich mir das dann auch gedacht, aber das das wirklich so klappt...)
    @globalplayer:

    globalplayer schrieb:

    Machst Du das irgendwie beruflich - das ist ja Krank!

    1.: In der zivilisierten Welt schon mal nen 13-jährigen mit Beruf gesehen?
    2.: Das hab ich jetzt überhört... 😉


Anmelden zum Antworten