partielle Spezialisierung von Template-Member-Funktionen



  • template< typename T, typename U>
    class bar
    {
      void foo(T t, U u);
    };
    
     template< typename T, typename U>
    void bar<T, U>::foo(T t, U u)                  // :)
    {
    }
    
     template<>
    void bar<int, float>::foo(int t, float u)     // :)
    {
    }
    
     template< typename U>
    void bar<int, U>::foo(int t, U u)            // :(
    {
    }
    

    Der dritte Fall geht nicht. Kann man sowas irgendwie anders machen?



  • Hallo,
    (Member-)Funktionen kann man nicht partiell spezalisieren.
    Ohne deine genaue Situation zu kennen, würde ich hier erstmal eine partielle Spezialisierung der Klasse vorschlagen:

    template< typename T, typename U>
    class bar
    {
      void foo(T t, U u);
    };
    
    template< typename U>
    class bar<int, U>
    {
    public:
        void foo(int t, U u);
    };
    template<typename U>
    void bar<int, U>::foo(int t, U u)
    {}
    
    template< typename T, typename U>
    void bar<T, U>::foo(T t, U u)                  // :)
    {
    }
    
     template<>
    void bar<int, float>::foo(int t, float u)     // :)
    {
    }
    

    Vielleicht wäre aber auch ein Membertemplate + Überladung angebracht. Was genau willst du denn machen?



  • Mein Problem ist, dass je nach Typ von T nur eine der verschiedenen angebotenen Spezialisierungen verwendet werden darf, die anderen sollen zu Compilerfehlern führen. Überladung hilft nix, da von T (im echten Programm) keine Instanzen angelegt werden sondern es nur über expliziten Aufruf mit einer festen Auswahl von erlaubten Klassen ( foo<T_typeA>(3)) angesprochen wird.
    Über Nacht ist mir aber die Idee zu kommen, dass ich das, was ich will mit ConzeptsConcepts erreichen kann.

    Danke!


Anmelden zum Antworten