Zur Zeit bin ich mit etwas Code wie fooA()
fest (achten Sie nicht auf den Körper), die einen bestimmten Container erwartet, sagen vector<double>
, als Argument.Pass Iterator anstelle von Container
double fooA(std::vector<double> const& list)
{
return list[0];
}
Jetzt will ich Iteratoren verallgemeinern und stattdessen zu verwenden:
template<typename InputIterator>
double fooB(InputIterator first, InputIterator last)
{
return *first;
}
Wie erklären, dass fooB()
den Iterator über double
iterieren erfordert?
Jemand könnte eine vector<string>::iterator
oder, noch schlimmer, wie es ohne eine Warnung kompilieren könnte, eine vector<int>::iterator
übergeben.
Vielleicht meinen Sie, dass Sie angeben müssen, dass der Iterator über Doppel durchlaufen muss? –
Heh, das kann gemacht werden, aber es ist nicht schön. Ich empfehle, nur einen Kommentar zu schreiben, da der Rückgabetyp erzwingt, dass der Iteratortyp zumindest in ein "double" konvertiert wird. –
'double' statt' int' natürlich. Das habe ich korrigiert, danke. Mein "realer Weltrückgabetyp" hängt nicht vom Iterator ab ... –