- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Mpl алгоритмы
Аналогично алгоритмам STL, алгоритмы MPL содержат полезные операции для обхода и обработки последовательностей и могут быть использованы в качестве примитивных строительных блоков для более сложных абстракций.
Различия stl и mpl алгоритмов:
Обработка метаданных, которые являются константами требует от алгоритмов MPL возвращать новые последовательности, т.к. изменить оригинальные нет возможности.
MPL алгоритмы работают напрямую с элементами последовательностями, а не посредством диапазонов итераторов. Эта работа более высокого уровня абстракции со всеми нюансами шаблонного метапрограммирования.
Когда результирующая последовательность должна быть возвращена, то очень удобно напрямую передавать результат одной операции к другой.
Пример:
Обход последовательности с заменой всех типов float на тип double, определением наибольшего типа и его разыменованием:
template <class Seq>
struct biggest_float_as_double
: mpl::deref< // >----------+
typename mpl::max_element< // >-------+ |
typename mpl::replace< // >----+ | |
Seq, // | | |
float, // | | |
double // | | |
>::type, // 1<---+ | |
mpl::less< // | |
mpl::sizeof_<_1>, // | |
mpl::sizeof_<_2>> // | |
>::type // 2<------+ |
> // 3<---------+
{};
// 1.Меняем в последовательности все float на double.
// 2.Находим наибоьший тип в последовательности.
// 3.Раскрываем наибольший тип.
Если вместо последовательности в алгоритмы max_element и replace передавать итераторы, то код biggest_float_as_double, выглядел бы следующим образом:
template <class Seq>
struct biggest_float_as_double
{
typedef typename mpl::replace<
typename mpl::begin<Seq>::type,
typename mpl::end<Seq>::type,
float, double
>::type replaced;
typedef typename mpl::max_element<
typename mpl::begin<replaced>::type,
typename mpl::end<replaced>::type,
mpl::less<mpl::sizeof_<_1>, mpl::sizeof_<_2>>
>::type max_pos;
typedef typename mpl::deref<max_pos>::type type;
};
Вставки
(Inserters)
Другое важное различие между алгоритмами MPL и STL проистекает из функциональной природы шаблонного метапрограммирования. Семейство алгоритмов STL по созданию последовательностей, таких как: copy, transform и replace_copy_if, все принимают итератор для вывода, в который читается результирующая последовательность. Назначение итератора вывода – фиксировать измененное состояния исходных последовательностей, такой формат работы нельзя организовать в функциональном программировании, при манипуляциями константами. Потому, каждый раз необходимо создавать новую последовательность. В результате этого аналоги алгоритмов STL, в MPL вынуждены иметь несколько изменненную логику работы: записывать выходные данные в новую последовательность, тип которой может отличается от входной последовательности. MPL использует для решения этой проблемы механизм вставок, что позволяет гибко настраивать алгоритм для решения конкретной задачи.
Прообразом «вставок» является семейство выводо- итераторо-создающих функций адаптеров STL, которые включает в себя std::front_inserter и std::back_inserter.
Вставки это не более чем тип с двумя вложенными элементами типами:
::state: представление информации осуществляется посредством алгоритма;
::operation: бинарная операция используется для создания нового «::state» из отдельного элемента выходной последовательности и текущего «::state».
