Vector/list an template-Funktion übergeben



  • Wie genau meinst du das? Wirklich vector/list übergeben, oder vector<T>/list<T>? Weil Letztere sind auch nur Typen, das geht ganz normal mit

    template <typename T>
    

    Falls du wirklich Ersteres meinst, da brauchst du so genannte template templates:

    template <template <typename, typename> class Container> // class ist wichtig hier, kann nicht typename sein.
    

    Verwendung siehe z.B. http://www.c-plusplus.net/forum/300414



  • Ne, ich mein, dass ich sowohl einen vector<T> als auch eine list<T> übergeben kann. Das bekomme ich nicht hin 🙂



  • ich weis es nicht sicher, müsste man mal testen. reicht sowas hier?

    template<class Container, class T>
    void foo(typename Container<T> & );
    


  • kann man es nicht einfach so machen? Bei mir kompiliert der Code 😃

    template <typename T> void foo(const T& t) {}
    


  • Skym0sh0 schrieb:

    ich weis es nicht sicher, müsste man mal testen. reicht sowas hier?

    template<class Container, class T>
    void foo(typename Container<T> & );
    

    Das ist auf zwei Arten gleichzeitig falsch...

    Ne, ich mein, dass ich sowohl einen vector<T> als auch eine list<T> übergeben kann. Das bekomme ich nicht hin 🙂

    Ja, also doch die einfache Variante. Wo ist das Problem?

    template <typename C>
    void reverse(C& c)
    {
      std::reverse(c.begin(), c.end());
    }
    


  • @cooky: was da heisst?


  • Mod

    Skym0sh0 schrieb:

    @cooky: was da heisst?

    Du hast das auf gleich mehrere Weisen verdreht. Sieh dir cookys erste Antwort an, wie das richtig geht. Jedenfalls ist bei dir sowohl die Erwartung eines Klassentemplates als Templateparameter falsch umgesetzt, als auch die letztendliche Anwendung dieses übergebenen Klassentemplates.



  • ok, hatte es in seinem link nur übersehen. aber klar, ganz oben stand es ja xD

    d.h. also:

    template<class <typename> Container>
    func(Container c); // kann hier vector<T> sein?!
    
    int main()
    {
        vector<CFoo> v;
        list<CFoo> l;
        deque<CFoo> d;
    
        func(v);
        func(l):
        func(d);
    
        return 0x0;
    }
    

    das müsste klappen?

    für mich sieht dieses class <typename> halt komisch (ungewohnt) aus.
    und wieso ist hier class != typename? das war doch in den template klammern sonst nie so?! (nur bei der typdefinition in funktionen wo der typ von indirekt von einem templateargument abhängig ist)


  • Mod

    Fast. Jetzt ist das Problem, dass vector natürlich ein Template mit zwei Parametern ist (den Allocator nicht vergessen!), der passt nicht zu der Vorgabe mit eines einparametrigen Templates.

    und wieso ist hier class != typename? das war doch in den template klammern sonst nie so?!

    Tja, ist eben einfach so (Standard 14.1,1). Hat vermutlich historische Gründe (ganz ganz früher gab es nur class). Kann man auch verteidigen, da ein template niemals ein primitiver Typ ist, sondern immer eine Klasse.



  • SeppJ schrieb:

    Kann man auch verteidigen, da ein template niemals ein primitiver Typ ist, sondern immer eine Klasse.

    Das dürfte sich mit Template Aliases ändern... 💡


Anmelden zum Antworten