- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Нульарные
Нулевые (нульарные) метафункции – метафункции не принимающие аргументы. Является любым типом, может быть простым классом или специализацией шаблона класса, которая предоставляет нам вложенный элемент «::type/::value». Например, add_const <int> - нульарная метафункция, которая всегда возвращает один и тот же результат: const int.
struct always_int
{
typedef int type;
};
Нулевые (нульарные) метафункции – любая метафункциональная специализация для конкретного типа, с общедоступным элементом «::type/::value», например: remove_pointer <char*>.
Рассмотрим следующую нульарную метафункцию:
struct always_int
{
typedef int type;
};
Несмотря на то, что практически все действия нульарных метафункций можно выразить посредством лямбда выражений, их использование инода имеет смысл:
struct add_pointer_f
{
template <class T>
struct apply : boost::add_pointer<T> {};
};
typedef mpl::vector<int, char*, double&> seq;
typedef mpl::transform<seq, boost::add_pointer<_>> calc_ptr_seq;
calc_ptr_seq - нульарная метафункция, так как есть вложенный «::type», который можно использовать не приводя к инстанцированию конкретных шаблонов.
Метафункции могут вызываться «лениво», а не сразу в момент получения аргументов. Используя такой прием, можно ускорить время компиляции, т.к. не будут делаться лишние действия (дополнительные инстанцирования). Также можно избежать искажения структуры программы выполняя недействительные вычисления.
Метрический анализ (Анализ размерностей)
Первое правило выполнения физических вычислений на бумаге состоит в том, что числами манипулируют не изолировано, но числа могут описывать сущности, которые не должны соединяться в одном выражении.
Цель: организация среды контроля типов и велечин, что позволит фиксировать ошибки в формулах при соединении величин, которые соединять нельзя прежде, чем они вызовут серьёзные проблемы в реальном мире.
Предотвращение взаимодействия величин с различными размерностями - не трудно; мы могли бы просто выражать размерности как классы, которые в состоянии взаимодействовать с классами эквивалентной размерности (быть такого же типа). Но различные размерности могут быть объединены, через умножение или разделение, чтобы произвести произвольно сложные новые размерности, надежная реализация такой возможности силами конкретных классов затруднительна.
Например, возьмем закон Ньютона, который связывает силу с массой и ускорением:
F = m*a;
Так как у массы и ускорения различные размерности, размерности силы должны быть комбинацией этих размерностей. А размерности ускорения является составным объектом, изменения скорости за период времени (производная скорости):
dv/dt;
При этом, скорость - изменение преодолеваеомго расстояня (l) за период времени (t):
(l/t)/t = l/t2;
Т.о. ускорение измеряеся в «метрах квадратных», из этого следует, что размерности силы должны быть:
F = m*(l/t2);
а сила обычно измеряется в кг (m/s2). Умножая величину массы и ускорения, мы умножаем их размерности - размерный анализ.
Реализуем ряд правил для системы типов C++. Джон Бартон и Ли Нэкмен первыми показазали, как сделать это в их оригинальной книге, Научный и Технический C++. Выразим их подход посредством метапрограммирования.
