Я иду через Т.1 CppCoreGuidelines, и есть следующие примеры
Пример 1
template<typename T>
// requires Incrementable<T>
T sum1(vector<T>& v, T s)
{
for (auto x : v) s += x;
return s;
}
Пример 2
template<typename T>
// requires Simple_number<T>
T sum2(vector<T>& v, T s)
{
for (auto x : v) s = s + x;
return s;
}
В соответствии с Руководством, приведенным выше, примеры являются концептуально плохими, поскольку они упустили возможность для обобщения (ограниченного низкоуровневыми понятиями «могут быть увеличены» или «могут быть добавлены»).
Как я могу выразить вышеупомянутые шаблоны, чтобы быть названным хорошим обобщенным шаблоном?
Плохая вещь в (прокомментированной) концепции. которые являются слишком конкретными и связаны с реализацией, поскольку они утверждают, что Incrementable<T>
ограничивается только оператором +=
а также Simple_number<T>
только для +
а также =
,
Они дают правильную концепцию «Арифметика» который обеспечивает более полный набор операций +
, +=
, =
…
Таким образом, вы можете заменить одну реализацию другой.
Еще лучше было бы заменить vector<T>
«range_view<T>
».
Здесь речь идет не о реализации, а о концепция.
Некоторые алгоритмы из STL полагаются на существование operator ==
но не требует operator !=
или требует наличия operator <
но нет operator >
, что делает их недостаточно общими.
Идея Orderable<T>
является более общим, чем HaveLess<T>
,
Большинство алгоритмов полагаются на некоторые требования типа, но должны иметь логическую составляющую
Стандартная библиотека имеет хорошую реализацию: http://en.cppreference.com/w/cpp/algorithm/accumulate
У него есть две версии, одна из которых принимает двоичный функтор, так что вы можете суммировать вещи без operator+
,
Требуются итераторы, поэтому вы можете суммировать любой итеративный контейнер, а не только векторы.
Это позволяет типу результата отличаться от типа значения контейнера. Например, вы можете захотеть сумму vector<float>
храниться в double
для повышенной точности.
Он также никогда не будет копировать значения, что больше, чем можно сказать для диапазона на основе for(auto)
Цикл в вопросе.