- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Итеративные алгоритмы
Итеративные алгоритмы - фундаментальные строительные блоки для многих алгоритмов MPL. Являются основой для написания пользовательских алгоритмов.
fold
Фомрат:
template
<
typename Sequence,
typename State,
typename ForwardOp
>
struct fold
{
typedef unspecified type;
};
Описание:
Возвращает результат последовательного применения бинарной операции ForwardOp к результату предыдущих вызовов ForwardOp (для первого вызова используется State) для каждого элемента последовательности в диапазоне
[begin<Sequence>::type, end<Sequence>::type).
Заголовок:
#include <boost/mpl/fold.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для итераций. |
State |
Любой тип |
Исходное состояние для первого применения ForwardOp. |
ForwardOp |
Бинарное лямбда-выражение |
Операция, которая будет выполнена при прямом обходе последовательности. |
Семантика выражений:
Для любой прямой последовательности s, бинарного лямбда-выражения op и произвольного типа state:
typedef fold<s,state,op>::type t;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef iter_fold<
s,
state,
apply<
op,
_1,
deref<_2>
>
>::type t;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<long,float,short,double,float,long,long double> types;
typedef mpl::fold<
types, // последовательность
mpl::int_<0>, // исходное состояние
mpl::if_< // условная операция
boost::is_float<mpl::_2>,
mpl::next<mpl::_1>,
mpl::_1
>
>::type number_of_floats;
BOOST_MPL_ASSERT_RELATION( number_of_floats::value, ==, 4 );
return 0;
}
Смотри также:
Algorithms, accumulate, reverse_fold, iter_fold, reverse_iter_fold, copy, copy_if
iter_fold
Фомрат:
template
<
typename Sequence,
typename State,
typename ForwardOp
>
struct iter_fold
{
typedef unspecified type;
};
Описание:
Возвращает результат последовательного применения бинарной операции ForwardOp к результату предыдущих вызовов ForwardOp (для первого вызова используется State) для каждого итератора последовательности в диапазоне
[begin<Sequence>::type, end<Sequence>::type).
Заголовок:
#include <boost/mpl/iter_fold.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для итераций. |
State |
Любой тип |
Исходное состояние для первого применения ForwardOp. |
ForwardOp |
Бинарное лямбда-выражение |
Операция, которая будет выполнена при прямом обходе последовательности. |
Семантика выражений:
Для любой прямой последовательности s, бинарного лямбда-выражения op и произвольного типа state:
typedef iter_fold<s,state,op>::type t;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef begin<Sequence>::type i1;
typedef apply<op,state,i1>::type state1;
typedef next<i1>::type i2;
typedef apply<op,state1,i2>::type state2;
...
typedef apply<op,staten−1,in>::type staten;
typedef next<in>::type - last;
typedef staten t;
где
n == size<s>::value
last == end<s>::type;
если
empty<s>::value == true,
то эквивалентно
typedef state t;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector_c<int,5,-1,0,7,2,0,-5,4> numbers;
typedef mpl::iter_fold<
numbers,
mpl::begin<numbers>::type,
mpl::if_<
mpl::less<
mpl::deref<_1>,
mpl::deref<_2>
>,
mpl::_2,
mpl::_1
>
>::type max_element_iter;
BOOST_MPL_ASSERT_RELATION
(mpl::deref<max_element_iter>::type::value, ==, 7);
return 0;
}
Смотри также:
Algorithms, reverse_iter_fold, fold, reverse_fold, copy
reverse_fold
Фомрат:
template
<
typename Sequence,
typename State,
typename BackwardOp,
typename ForwardOp = mpl::_1
>
struct reverse_fold
{
typedef unspecified type;
};
Описание:
Возвращает результат последовательного применения в обратном порядке бинарной операции BackwardOp к результату предыдущих вызовов BackwardOp (для первого вызова используется State) для каждого элемента последовательности в диапазоне
[begin<Sequence>::type, end<Sequence>::type).
Если ForwardOp обеспечивается, то она применяется на этапе раскрутки рекурсии, сформированный результат передается первому вызову BackwardOp.
Заголовок:
#include <boost/mpl/reverse_fold.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для итераций. |
State |
Любой тип |
Исходное состояние для первого применения BackwardOp/ForwardOp. |
BackwardOp |
Бинарное лямбда-выражение |
Операция, которая будет выполнена при обратном обходе последовательности. |
ForwardOp |
Бинарное лямбда-выражение |
Операция, которая будет выполнена при прямом обходе последовательности. |
Семантика выражений:
Для любой прямой последовательности s, бинарного лямбда-выражения backward_op и forward_op и произвольного типа state:
typedef reverse_fold<s, state, backward_op >::type t;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef reverse_iter_fold<
s,
state,
apply<backward_op, _1, deref<_2>>
>::type t;
typedef reverse_fold<s, state, backward_op, forward_op>::type t;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::list_c<int,5,-1,0,-7,-2,0,-5,4> numbers;
typedef mpl::list_c<int,-1,-7,-2,-5> negatives;
typedef mpl::reverse_fold<
numbers,
mpl::list_c<int>,
mpl::if_<
mpl::less<
mpl::_2, // т.к. _1 - проверен
mpl::int_<0>
>,
push_front<mpl::_1, mpl::_2>,
mpl::_1
>
>::type result;
BOOST_MPL_ASSERT(( mpl::equal< negatives, result > ));
return 0;
}
Достигнуть того же эффекта можно более лакончино, с помощью метафункции remove_if.
Смотри также:
Algorithms, fold, reverse_iter_fold, iter_fold
reverse_iter_fold
Фомрат:
template
<
typename Sequence,
typename State,
typename BackwardOp,
typename ForwardOp = mpl::_1
>
struct reverse_iter_fold
{
typedef unspecified type;
};
Описание:
Возвращает результат последовательного применения в обратном порядке бинарной операции BackwardOp к результату предыдущих вызовов BackwardOp (для первого вызова используется State) для каждого итератора последовательности в диапазоне
[begin<Sequence>::type, end<Sequence>::type).
Если ForwardOp обеспечивается, то она применяется на этапе раскрутки рекурсии, сформированный результат передается первому вызову BackwardOp.
Заголовок:
#include <boost/mpl/reverse_iter_fold.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для итераций. |
State |
Любой тип |
Исходное состояние для первого применения BackwardOp/ForwardOp. |
BackwardOp |
Бинарное лямбда-выражение |
Операция, которая будет выполнена при обратном обходе последовательности. |
ForwardOp |
Бинарное лямбда-выражение |
Операция, которая будет выполнена при прямом обходе последовательности. |
Семантика выражений:
Для любой прямой последовательности s, бинарного лямбда-выражения backward_op и forward_op и произвольного типа state:
1:
typedef reverse_iter_fold<s, state, backward_op>::type t;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef begin<s>::type i1;
typedef next<i1>::type i2;
...
typedef next<in>::type last;
typedef apply<backward_op,state,in>::type staten;
typedef apply<backward_op,staten,in−1>::type staten−1;
...
typedef apply<backward_op,state2,i1>::type state1;
typedef state1 t;
где
n == size<s>::value
last == end<s>::type;
если
empty<s>::value == true,
то эквивалентно
typedef state t;
2:
typedef reverse_iter_fold< s,state,backward_op,forward_op >::type t;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef reverse_iter_fold<
Sequence,
iter_fold<s,state,forward_op>::type,
backward_op
>::type t;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector_c<int,5,-1,0,-7,-2,0,-5,4> numbers;
typedef mpl::list_c<int,-1,-7,-2,-5> negatives;
typedef mpl::reverse_iter_fold<
numbers,
mpl::list<>,
mpl::if_<
mpl::less<
mpl::deref<mpl::_2>,
mpl::int_<0>
>,
mpl::push_front<mpl::_1, mpl::_2>,
mpl::_1
>
>::type iters;
BOOST_MPL_ASSERT
((
mpl::equal<
negatives,
mpl::transform_view<
iters,
mpl::deref<mpl::_1>
>
>
));
return 0;
}
Смотри также:
Algorithms, iter_fold, reverse_fold, fold
accumulate
Фомрат:
template
<
typename Sequence,
typename State,
typename ForwardOp
>
struct accumulate
{
typedef unspecified type;
};
Описание:
Возвращает результат последовательного применения бинарной операции ForwardOp к результату предыдущих вызовов ForwardOp (для первого вызова используется State) для каждого элемента последовательности в диапазоне
[begin<Sequence>::type, end<Sequence>::type).
[accumulate - синоним fold]
Заголовок:
#include <boost/mpl/accumulate.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для итераций. |
State |
Любой тип |
Исходное состояние для первого применения ForwardOp. |
ForwardOp |
Бинарное лямбда-выражение |
Операция, которая будет выполнена при прямом обходе последовательности. |
Семантика выражений:
Для любой прямой последовательности s, бинарного лямбда-выражения op и произвольного типа state:
typedef accumulate<s,state,op>::type t;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef fold<s,state,op>::type t;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<long,float,short,double,float,long,long double> types;
typedef mpl::accumulate<
types,
mpl::int_<0>,
mpl::if_<
boost::is_float<mpl::_2>,
mpl::next<mpl::_1>,
mpl::_1
>
>::type number_of_floats;
BOOST_MPL_ASSERT_RELATION( number_of_floats::value, ==, 4 );
return 0;
}
Смотри также:
Algorithms, fold, reverse_fold, iter_fold, reverse_iter_fold, copy, copy_if
