Архитектурная акустика/Реализация/make iterator adapter: различия между версиями
Перейти к навигации
Перейти к поиску
(Новая страница: «{{DISPLAYTITLE:Архитектурная акустика/Реализация/make_iterator_adapter}} {{function_begin |template <template <class ...> class _Ad…») |
|||
Строка 16: | Строка 16: | ||
make_iterator_adapter<IteratorAdapter2D>(container.begin()); | make_iterator_adapter<IteratorAdapter2D>(container.begin()); | ||
</source> | </source> | ||
Вторая часть аргументов <tt>adapter_params</tt> делегируется конструкторам адаптера. | |||
{{example_begin}} | {{example_begin}} |
Текущая версия на 02:50, 9 января 2018
template <template <class ...> class _Adapter, class ... _AdapterParams>
auto make_iterator_adapter(_AdapterParams&& ... adapter_params) -> /*См. описание*/
Создает заданный адаптер с дедукцией его конкретного типа.
- Параметры шаблона
_Adapter Шаблон, который задает используемый адаптер. Специализируется частью параметров _AdapterParams..., в результате задавая тип создаваемого адаптера. _AdapterParams Набор вычисляемых дедукцией типов аргументов, поданных в качестве adapter_params... на вход функции. - Параметры
adapter_params... Набор параметров, на основе которых создается адаптер. Первые параметры используются для дедукции типов, которые специализируют шаблон _Adapter. - Возвращаемое значение:
- Созданный адаптер.
Первая часть аргументов adapter_params используется для выведения конкретного типа адаптера - специализации шаблона _Adapter. То какая эта часть определяется шаблоном _Adapter. Например, первые один или два аргумента могут задавать типы итераторов в соответствующих измерениях, что дает возможность специализировать ими шаблон IteratorAdapter2D при вызовах:
auto it2D = make_iterator_adapter<IteratorAdapter2D>(container.begin(), container.begin()->begin());
make_iterator_adapter<IteratorAdapter2D>(container.begin());
Вторая часть аргументов adapter_params делегируется конструкторам адаптера.
Пример
auto itChain = make_iterator_adapter<IteratorAdapterConditional>(
make_iterator_adapter<IteratorAdapterForStep>(
i,
std::thread::hardware_concurrency(),
adapt_iterator_range<IteratorAdapter2D>(cont.crbegin(), cont.crend())
),
[](IteratorAdapterForStep<IteratorAdapter2D<Matrix<int>::const_reverse_iterator>> _it) -> bool {return (*_it & 1) == 0; },
[&cont](auto _it) -> bool {return _it.adaptation_base() != cont.crend(); }
);