Template-Templates



  • Hi!

    Ich bekomme es gerade nicht hin, wie kann man so etwas lösen?:

    template<typename T> class A
    {
    };
    
    template<typename T> class B
    {
    };
    
    template<typename T, typename F<T> > class X
    {
    };
    
    X< char, A<char> > x;
    

    Ich will also erzwingen, dass der Templateparameter F zu der Klasse X selbst eine Templateklasse ist, die auch den Parameter T hat.



  • willst du einen template-template parameter und den selbst mit dem ersten template-argument spezialisieren (1), oder willst du eine spezialisierung für dein template darauf, dass das zweite argument mit dem ersten parametrisiert sein muss (2)?

    //(1)
    template <class T, template <class> class U>
    struct Foo
    {
       typedef U<T> AutoU;
    };
    
    //(2)
    template <class T, class U>
    struct Bar;
    
    //Spezialisierung
    template <class T, template <class> class U>
    struct Bar<T, U<T> >
    {
    };
    

  • Mod

    Badestrand schrieb:

    Hi!

    Ich bekomme es gerade nicht hin, wie kann man so etwas lösen?:

    template<typename T> class A
    {
    };
    
    template<typename T> class B
    {
    };
    
    template<typename T, typename F<T> > class X
    {
    };
    
    X< char, A<char> > x;
    

    Ich will also erzwingen, dass der Templateparameter F zu der Klasse X selbst eine Templateklasse ist, die auch den Parameter T hat.

    Durch partielle Spezialisierung:

    template<typename T> class A;
    
    template<typename T, typename U > class X; // bleibt undefiniert
    
    template<typename T, template<typename> class TT> class X< T, TT< T > >
    {
    ...
    };
    // oder besser in Hinblick auf eine brauchbare Fehlermeldung:
    template<typename T, typename U > class Y
    {
        BOOST_STATIC_ASSERT(( is_template_class_with_1_type_parameter< U, T > ));
    ...
    };
    // mit Hilfstemplate nach obigem Schema:
    template<typename, typename> struct is_template_class_with_1_type_parameter { static const bool value = false; };
    template<typename T, template<typename> class TT> struct is_template_class_with_1_type_parameter< TT< T >, T > { static const bool value = true; };
    


  • Juchu, danke euch! Genau, ich suchte die partielle Spezialisierung, hatte aber gedacht, dass man das direkt irgendwie angeben kann, keine Ahnung... Ich glaube, ich setze aber doch queer_boys (1)-Methode ein 🙂


Anmelden zum Antworten