Teamplate-Problem



  • Ich hätte gerne eine Funktion, welche eine Summen-Reduktion ausführt.
    Als Template wöllte ich zum einen den Typ der Zahlen (also double oder int ...)
    und zum anderen einen Containertypen, der übergeben wird.

    Also grob:

    T sum(Container a)
    {
      for( a::iterator i = a.begin ; i != end ; i++)
        summiere;
      return sum;
    

    Ich scheitere daran, den Containertypen als Template anzugeben.

    Wenn ich mich zB auf Vector festlege, würde das hier gehen:

    template <typename T>
    T sum(const vector<T>& v)
    {
      T sum = 0;
      for(typename vector<T>::const_iterator iter = v.begin(); iter != v.end(); iter++)
      {
        sum = sum + *iter;
      }
      return sum;
    }
    

    Nun möchte ich noch den Container-Typen freilassen. Wie ginge das dann?

    Nebenbei: Wieso genau brauche ich (einfach erklärt) das typename
    in typename vector<T>::iterator?
    Nimmt der Compiler ansonsten an, dass es sich um eine Member-Variable handelt?



  • Die Funktion gibts schon in besser: std::accumulate. Besser ist insbesondere, dass Iteratoren statt Container benutzt werden.



  • Danke, aber mir geht es nicht um eine gute Implementierung, sondern darum, es überhaupt umzusetzen, und halt genau so.

    Deswegen ja auch das einfache Beispiel.


  • Mod

    template<typename Container>
    typename Container::value_type accumulate_range( Container&& c ) 
    {
        typename Container::value_type rval{};
    
        for( auto const& value : c )
            rval += value;
    
        return rval;
    }
    

    Kann man dann noch für Arrays verallgemeinern (per iterator_traits und std::begin ).

    Wieso genau brauche ich (einfach erklärt) das typename
    in typename vector<T>::iterator?

    Hier klicken: http://bit.ly/1oIMU5l
    Gleich der erste Link.


Anmelden zum Antworten