Архитектурная акустика/Реализация/make_iterator_adapter

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
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(); }
);