będę throught T.1 z CppCoreGuidelines i są następujące przykładyKorzystanie z szablonów w celu podniesienia poziomu abstrakcji kodu?
Przykład 1
template<typename T>
// requires Incrementable<T>
T sum1(vector<T>& v, T s)
{
for (auto x : v) s += x;
return s;
}
Przykład 2
template<typename T>
// requires Simple_number<T>
T sum2(vector<T>& v, T s)
{
for (auto x : v) s = s + x;
return s;
}
Zgodnie z wytycznymi powyżej przykładach są źle koncepcyjnie , ponieważ stracił szansę na uogólnienie (ograniczone do koncepcji niskiego poziomu "można zwiększyć" lub "można dodać").
Jak mogę wyrazić powyższe szablony, aby można było je nazwać dobrymi szablonami uogólnionymi?
Dlaczego nie używać 's = std :: accumulate (std :: begin (v), std :: end (v), s)'?Działa z każdym standardowym kontenerem (i tablicami w stylu waniliowym C), nie opiera się na 's' i elementach' v' będących tego samego typu (chociaż dodawanie ich wymaga zdefiniowania). Sugerowałbym, że jest znacznie bardziej ogólny niż którykolwiek z twoich przykładów - a 'std :: accumulate()' może być użyty do innych rzeczy. – Peter