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.
-
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_traitsundstd::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.