- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Полиморфизм
Управление большим множеством разнообразных форм малым единообразным способом. Управление различными типами через единый интерфейс. Наличие непротиворечивого интерфейса является лучшим способом гарантировать, что код допускает повторное использование, и компоненты взаимодействуют качественно. Поскольку шаблоны C++ по сути не обрабатывают различные виды метаданных полиморфно, MPL следует за соглашением использования оберток типа вокруг метаданных не-типа. В частности числовые метаданные представлены как тип с вложенным числовымм константами, обозначаемыми как «::value».
Фундаментальная Теорема Разработки программного обеспечения (FTSE): любая проблема может быть разрешена с помощью внедрения дополнительного уровня абстракции (Батлер Лэмпсон).
Возможности свойств:
Параметры и вложенные типы шаблона свойств подобны обычным функциям, но которые принимают и возвращают вместо значений – типы, на этапе компиляции.
Шаблоны свойств открывают две существенных возможности, которые недоступные обычным функциям:
Специализация. можно менять результат работы шаблона свойств для определенных значений/типов, добавляя отдельную специализацию. Можно даже изменить результат целого диапазона «значений» (например, все указатели) при использовании частичной специализации. Специализация привносит особую гибкость в уровень динамики, посредством создания оберток для функций, так, например можно добавить «перегрузку» std::abs, который вызывается только когда его параметр - нечетное число.
Множественные возвращаемые значения. В то время как параметры обычных функций ассоциированы только с одним значением, у свойств часто есть больше чем один результат. Например, std::iterator_traits содержит пять вложенных типов (в пользовательской специализации их может быть сколько угодно).
Организация свойств в Boost:
В boost/ type_traits принято решение использовать только однозначные метафункции, тем самым избегая модели «блоб».
Результаты свойств имею следюущие обозначения:
Свойства значений: «::value»;
Свойства типов: «::type»;
Свойства обеспечивают механизм установки ассоциации между различными метаданными посредством специализаций шаблонных классов. Главная особенность идиомы свойст - это неинтрузивность (модульность, несвязанность отдельных частей, в противоположность модели «блоб», которая является интрузивной). Так, можно устанавливать новые ассоциации не затрагивая уже существующие. Метафункции MPL могут рассматриваться как особый случай свойств, где есть только одно значение результата для любого ввода.
В boost/ type_traits содержится несколько метафункций для низкоуровневого манипулирований типом. Например, результат add_reference всегда - ссылочный тип:
boost::add_reference<char>::type // char&
boost::add_reference<int&>::type // int&
В boost/ type_traits восновном используется булевские метафункции, которые позволяют определять фундаментальные свойства любого типа:
boost::is_reference<char>::value // false
boost::is_reference<int&>::value // true
