Template Template Parameter Argument Deduktion



  • Wie bekomme ich an der Stelle es hin, die Template Parameter explizit für die Funktion benennen zu können? Für die Klasse funktioniert es ja, und nein es ist keine Option das in die Klasse mitanzugeben, sondern es geht explizit darum, dass die Funktion (hier assign) andere Typen erlauben muss.

    #include <cstddef>
    #include <iostream>
    
    class TD {};
    class TN {};
    
    template <typename S = size_t, typename TR = TN>
    class A {
    public:
        static inline constexpr bool check (S s) {
            if (s != 0) return true;
    
            return false;
        }
    
        template <typename T, typename STR, template<typename, typename> typename AS>
        static inline constexpr void assign (const S size, T* source, const T* const target) {
            AS<S, STR>::check(size);
    
            *target = *source;
        }
    };
    
    template <typename T, typename TR, template <typename,typename> typename Assign = A>
    class M {
    T* p_;
    public:
        template <typename RTR, template<typename, typename> typename ASS>
        void assign (const M<T, RTR, ASS>& rhs) {
            size_t s = 10;
    
            // das ist die problematische Stelle
            ASS<size_t, TR>::assign (s, rhs.p_, this->p_);
            // das hier funktioniert nicht
            // ASS<size_t, TR>::assign<T,RTR,A<size_t,RTR>> (s, rhs.p_, this->p_);
        }
    };
    
    int main () {
        M<int, TN, A> m1, m2;
    
        m1.assign(m2);
    }
    
    

  • Mod

    Abgesehen von ein paar Fluechtigkeitsfehlern (T* source, const T* const target) funktioniert es doch:

    ASS<size_t, TR>::template assign<T,RTR,Assign> (s, rhs.p_, this->p_);
    

    Oder was war Deine Frage?



  • Danke,
    auf den Gedanken Zwischen Klasse und Funktion noch ein template einzuschieben bin ich nicht gekommen.


Anmelden zum Antworten