Template Funktionen



  • Hallo an alle,

    wie kann ich eine template-Funktion schreiben die einen std::vector und eine std::list jeweils vom generischen Typ T akzeptiert?

    Pseudocode:

    template <class T,class U> 
    void display(U<T>& container)
    

    Mir wurde ein Tipp gegeben zu

    std::allocator<T>

    . Damit kann ich aber nichts anfangen.

    Die Funktion soll einfach nur die Inhalte des Vektors oder der Liste ausgeben(cout oder printf)

    Danke.



  • template <typename Container>
    std::ostream& print(std::ostream& out, const Container& c)
    {
      for (auto& x : c)
        out << c;
      return out;
    }
    
    print(std::cout, container);
    

  • Mod

    Holzweg. Besonders das mit dem allocater, was 1. eine unnötig vage Formulierung dessen ist, was zu tun ist und 2. sowieso für ganz was anderes da ist, vermutlich hast du ungeschickt gefragt.

    Mach einfach so:

    template <typename Iterator> void foo(Iterator begin, Iterator end);
    

    Dann funktioniert der Code mit ALLEM!

    Wenn es unbedingt zu deiner Vorgabe passen muss, dann:

    template <class T> void display(const T& container)
    

    edit: Wieder zu langsam.



  • VRComputing schrieb:

    template-Funktion

    Funktionstemplate.



  • Danke erst mal, hat funktioniert.

    Neue Aufgabe:

    template <class T> 
    void read(std::vector<T>& vec,std::string& filename)
    {
      ifstream file(filename.c_str(), ifstream::in);
      T data;
      while (file>>data)
        vec.push_back(data);
      file.close();
    }
    

    Diese Funktion soll aus einer Datei einlesen. Die Datei hat Zeilen mit einem Wort oder einer Kommazahl.

    std::vector<T>& vec
    

    soll eine Liste<T> oder einen Vektor<T> übernehmen können.

    Wie muss ich das nun machen?



  • Passe SeppJ's zweites Beispiel deiner Funktion an. Alternativ kannst du Output-Iteratoren nehmen, dazu müsstest du dich einlesen.

    < 💡 >



  • Ich versteh's nicht. Kann mir bitte jemand eine Lösung geben?





  • Obligatorischer Hinweis:

    VRComputing schrieb:

    Diese Funktion soll aus einer Datei einlesen.

    Diese Funktionsvorlage soll aus einer Datei einlesen.

    Ansonsten:

    template<typename Container>
    void read(Container &cont, std::string const &filename)
    {
      typename Container::value_type data; // <--
    }
    

    Den Rest kannst du hoffentlich selbst. Allerdings wäre die Iteratorvariante in der Tat eleganter, weil allgemeiner -- wenn du die Daten aus der Datei beispielsweise gleich in ein Socket stopfen willst oder was auch immer. Du brauchst hier ja auch nur einen OutputIterator:

    template<typename iterator_t>
    void transfer_file(std::string const &filename, iterator_t dest) {
      typename std::iterator_traits<iterator_t>::value_type data;
    }
    

    Und dann statt

    read(container, "foo.txt");
    

    halt

    transfer_file(std::back_inserter(container), "foo.txt");
    

    ...bzw. irgendeinen anderen OutputIterator.


Anmelden zum Antworten