Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
template_metaprogramming_ru.docx
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
774 Кб
Скачать
☆

Уход от ненужного вычисления

«Ленивый» подход позволяет решить множество проблем подобных следующим:

// does seq contain int, int&, int const&, int volatile&, or int const volatile&?

typedef mpl::contains<

mpl::transform_view<

seq,

boost::remove_cv<boost::remove_reference<_>>

>,

int

>::type found;

// find the position of the least integer whose factorial is >= n

typedef mpl::lower_bound<

mpl::transform_view<mpl::range_c<int,0,13>, factorial<_1>>,

n

>::type::base number_iter;

// return a sorted vector of all the elements from seq1 and seq2

typedef mpl::sort<

mpl::copy<

mpl::joint_view<seq1,seq2>, //просмотры нерасширяемы по умолочанию

mpl::back_inserter<mpl::vector<>>

>::type

>::type result;

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

Выборочная обработка элемента

С ленивой версией алгоритма filter - filter_view, можно обработать подмножество элементов последовательности, не создавая промежуточную последовательность. Когда итераторы в filter_view инкрементированы, базовый итератор в «просматриваемой» последовательности продвигается до тех пор, пока функция filter не будет выполнена:

// a sequence of the pointees of all pointer elements in Seq

mpl::transform_view<

mpl::filter_view<Seq, boost::is_pointer<_1>>,

boost::remove_pointer<_1>

>

Итератор-адаптер

Итераторы последовательности просмотра – итераторы-адаптеры (важная концепция). Так же, как последовательность просмотра, созданная на основе одной или нескольких базовых последовательностей, итератор-адаптер - это итератор, который адаптирует поведение одного или нескольких базовых итераторов.

Итераторы-адаптеры настолько полезны в C++ времени выполнения, что есть отдельная библиотека для них в коллекции Boost. STL также содержит несколько итераторов-адаптеров, в первую очередь это std::reverse_iterator, который пересекает ту же самую последовательность элементов как и основной итератор, но в противоположном направлении. Итераторы в mpl::filter_view – итераторы-адаптеры обхода последовательности. Итератор-адаптер доступа обеспечивает доступ к значениями различных элементов его базового итератора, подобно итераторам-адаптерам в mpl::transform_view.

Аналогично тому как в STL можно получить доступ к базовому итератору std::reverse_iterator, вызывая функцию-класса base(), итераторы-адаптеры MPL обеспечивают доступ к своим базовым итераторам посредством вложенного элемента типа «::base». Во всех других отношениях итераторы-адаптеры точно такие же как любой другой итератор.

Итератор-адаптер может быть одной из трех категорий итераторов, которая может быть отличной от категории его базового итератора (ов). Все остальные требования обычных итераторов применимы и к итераторам-адаптерам.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]