string container template



  • Kann man eine Methode definieren die Container von Strings nimmt? So geht es nicht.

    #include <iostream>
    #include <string>
    #include <vector>
    #include <list>
    using namespace std;
    
    template<typename T>
    void foo(const T<std::string>& c)
    //void foo(const T& c)
    {
    	std::string s = c.front();	
    }
    
    int main() {
    	std::vector<std::string> v;
    	foo(v);
    	return 0;
    }
    


  • Weiß nicht, vielleicht sowas wie

    template<template<typename,typename> class T,typename A>
    void foo(const T<string,A>& c)
    {
        std::string s = c.front();
    }
    


  • Denn jeder Container hat als zweites Argument noch den sog. Allocator. Der hat aber einen Defaultwert, also muss man ihn nicht angeben, aber ohne ihn in der Funktion passt das nicht.



  • Das geht mit einem template-Alias (ab C++11):

    #include <iostream>
    #include <string>
    #include <vector>
    #include <list>
    using namespace std;
    
    template<typename T>
    using Container = std::vector<T>;
    
    void foo(const Container<std::string>& c) {
        std::string s = c.front(); 
    }
    
    int main() {
        std::vector<std::string> v;
        foo(v);
        return 0;
    }
    

  • Mod

    Oder man macht's so, wie es ueblich ist, d.h. so, dass voellig egal ist, welche Art von Objekt dahinter steht:

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

    Funktioniert mit allen STL-Containern, Array und allen selbstgeschriebenen Containern, die irgendwie das Konzept eines Anfangs und eines Endes umsetzen. Es muessen nicht einmal std::strings sein, es reicht, wenn die Objekte hinter den Iteratoren sich wie std::strings verhalten, zum Beispiel eine selbstgeschriebene Stringklasse. Funktioniert alles. Ohne Mehraufwand.



  • templatealias schrieb:

    Das geht mit einem template-Alias (ab C++11):

    Dann kann man auch gleich std::vectorstd::string hinschreiben.



  • @nathan: stimmt....
    Beim Vektor muss der Typ für den Allokator berücksichtigt werden, dann geht es:

    #include <iostream>
    #include <string>
    #include <vector>
    
    template< template<typename, typename> class Container, class A>
    void foo(const Container<std::string, A>& c) {
        std::string s = c.front(); 
    }
    
    int main() {
        std::vector<std::string> v;
        foo(v);
        return 0;
    }
    


  • das hatte volkardt schon geschrieben, wie mir leider jetzt erst auffällt - wer lesen kann ist im Vorteil...


Anmelden zum Antworten