2017-08-19 18 views
7

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?

+0

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

Odpowiedz

5

Złe jest pojęcie (skomentowane). które są zbyt szczegółowe i powiązane z implementacją, ponieważ stwierdzają, że Incrementable<T> ogranicza się tylko do operatorów += i Simple_number<T> tylko dla + i =.

Zapewniają prawidłową koncepcję „Arytmetyka” która zapewnia bardziej kompletny zestaw operacji +, +=, = ...

Więc można zastąpić jedną realizację przez drugą.

Jeszcze lepszym rozwiązaniem byłoby zastąpienie vector<T> przez "range_view<T>".

Nie dotyczy to realizacji, ale koncepcji .

Niektóre algorytmy z STL polegać na istnienie operator == ale nie wymaga operator != lub wymaga istnienia operator < ale nie operator >, które sprawiają, że nie im wystarczająco rodzajowy.

Pojęcie Orderable<T> jest bardziej ogólne niż HaveLess<T>.

Większość algorytm opiera się na pewnym wymogiem typu, ale powinien mieć logiczną WKŁAD

+0

, więc który z nich byłby preferowany + = lub + i = dla szablonu ..lub to nie robi różnicy? –

0

Standardowa biblioteka ma dobrą realizacji: http://en.cppreference.com/w/cpp/algorithm/accumulate

Posiada dwie wersje, jeden który odbywa binarny funktor tak możesz podsumować rzeczy bez operator+.

Wykonuje iteratory, dzięki czemu można zsumować każdy kontener iteracyjny, a nie tylko wektory.

Pozwala na odróżnienie typu wyniku od typu wartości kontenera. Na przykład możesz chcieć zapisać sumę vector<float> w double, aby zwiększyć precyzję.

To również nigdy nie będzie kopiować wartości, co jest więcej niż można powiedzieć o pętli for(auto) na podstawie zakresu w pytaniu.

+0

Jeśli podążysz za linkiem podanym przez OP, to nie ta część jest krytykowana, ale koncepcja. – Jarod42

+0

Po prostu pomyliłem się z tekstem, w inny sposób możemy przedstawić sumę oprócz + = i +, = –

Powiązane problemy