Использование шаблонов для повышения уровня абстракции кода?

Я иду через Т.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;
}

В соответствии с Руководством, приведенным выше, примеры являются концептуально плохими, поскольку они упустили возможность для обобщения (ограниченного низкоуровневыми понятиями «могут быть увеличены» или «могут быть добавлены»).

Как я могу выразить вышеупомянутые шаблоны, чтобы быть названным хорошим обобщенным шаблоном?

7

Решение

Плохая вещь в (прокомментированной) концепции. которые являются слишком конкретными и связаны с реализацией, поскольку они утверждают, что Incrementable<T> ограничивается только оператором += а также Simple_number<T> только для + а также =,

Они дают правильную концепцию «Арифметика» который обеспечивает более полный набор операций +, +=, =

Таким образом, вы можете заменить одну реализацию другой.

Еще лучше было бы заменить vector<T> «range_view<T>».

Здесь речь идет не о реализации, а о концепция.

Некоторые алгоритмы из STL полагаются на существование operator == но не требует operator !=или требует наличия operator < но нет operator >, что делает их недостаточно общими.

Идея Orderable<T> является более общим, чем HaveLess<T>,

Большинство алгоритмов полагаются на некоторые требования типа, но должны иметь логическую составляющую

5

Другие решения

Стандартная библиотека имеет хорошую реализацию: http://en.cppreference.com/w/cpp/algorithm/accumulate

У него есть две версии, одна из которых принимает двоичный функтор, так что вы можете суммировать вещи без operator+,

Требуются итераторы, поэтому вы можете суммировать любой итеративный контейнер, а не только векторы.

Это позволяет типу результата отличаться от типа значения контейнера. Например, вы можете захотеть сумму vector<float> храниться в double для повышенной точности.

Он также никогда не будет копировать значения, что больше, чем можно сказать для диапазона на основе for(auto) Цикл в вопросе.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector