CRTP, ist dies erlaubt?



  • Hi,

    ich versuche gerade etwas mit dem Curiously recurring template pattern rumzuspielen. Konkret geht es um folgendes:

    template<class Derived>
    struct Base{
        //Bar ist beliebige template magie
        typename Bar<typename Derived::Foo>::type x(){
            return Derived::Foo();
        }
    };
    
    class Derived:public Base<Derived>{
         struct Foo{...};
    };
    
    Derived d;
    d.x();//definiert?
    

    Konkret geht es mir um das BarDerived::Foo::type. Ich weiß, dass dies als define in Base unzulässig wäre, weil Derived zu dem Zeitpunkt incomplete ist. Andererseits wird x() erst viel später aufgerufen und der Compiler muss deswegen zu dem Zeitpunkt noch keinen Code für x() erzeugen.

    und wie sieht es hiermit aus?

    template<class Derived>
    struct Base{
        template<class T>
        struct Foobar{...};
    
        typename Bar<Foobar<typename Derived::Foo> >::type x(){
            return Derived::Foo();
        }
    };
    

    Hierbei hängt sogar die innere Klasse von dem Typen ab.

    Irgendein Standardprofi zugegen? 🙂 Gibt es da Faustregeln, was man darf und was nicht?


  • Mod

    Nichts dagegen einzuwenden. Ob das Ganze tatsächlich funktioniert kann ohnehin erst bei der Instantiierung festgestellt werden.


Anmelden zum Antworten