- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Метрики
Международный стандарт под названием Système International d'Unites (СИ -Система Интернациональная: международная метрическая система физических величин) представляет каждую величину как комбинацию следующих размерностей:
Масса;
Длины или позиции;
Время;
Заряд;
Температура;
Интенсивность;
Угол.
(См. http://ru.wikipedia.org/wiki/%D0%A1%D0%98)
Чтобы обобщить эти единицы, система должна была бы быть в состоянии представить семь или больше фундаментальных размерностей. Необходимо также выражать составные размерности, такие как сила, созданые посредством умножения или разделения фундаментальных.
Составная размерность – результат взаимодействия фундаментальных размерностей. Если бы мы собирались выразить эти взаимодействия на этапе выполнения, то могли бы использовать массив int из семи элементов, по одному для каждой фундаментальной размерности:
Деления 1/х записываются в виде отрицательной степени х-1;
typedef int dimension[7]; // m, l, t, ...
dimension const mass = {1, 0, 0, 0, 0, 0, 0};
dimension const length = {0, 1, 0, 0, 0, 0, 0};
dimension const time = {0, 0, 1, 0, 0, 0, 0};
//...
При таком подходе, сила будет выражена как:
dimension const force = {1, 1, -2, 0, 0, 0, 0}; // m*l/t2 == (m*l)-t2
Однако, если необходимо получить размерности в системе типов, то эти массивы не позволят достигнуть цели, т.к. все элементы имеют одинаковые типы. Вместо этого мы нуждаемся в типах, которые непосредственно представляют последовательности чисел (множества различных значений), так, чтобы у двух масс был тот же самый тип, а масса и длина имели различный тип.
MPL предоставляет набор последовательностей типов, что решает данную проблему.
Например, мы можем создать последовательность встроенных целочисленных типов:
#include <boost/mpl/vector.hpp>
typedef boost::mpl::vector<signed char, short, int, long> signed_types;
Последовательность типов можно использовать подобно последовательностям значений с помощью числовых метафункций, которые передают и возвращают типы в обертках, имеющих вложенные значения «::value», таким образом, числовые последовательности – на самом деле это последовательности типов в обертках.
MPL предоставляет для этого различные обертки, например для целых чисел int_<N>, которая содержит целочисленную константу в элементе «::value»:
#include <boost/mpl/int.hpp>
namespace mpl = boost::mpl; // namespace alias (синоним)
static int const five = mpl::int_<5>::value;
Библиотека содержит целый комплект константных интегральных оберток, таких как long_ и bool _.
Теперь можно гибче выразить фундаментальные размерности для каждого конкретного типа:
typedef mpl::vector
<
mpl::int_<1>,
mpl::int_<0>,
mpl::int_<0>,
mpl::int_<0>,
mpl::int_<0>,
mpl::int_<0>,
mpl::int_<0>
> mass;
typedef mpl::vector
<
mpl::int_<0>,
mpl::int_<1>,
mpl::int_<0>,
mpl::int_<0>,
mpl::int_<0>,
mpl::int_<0>,
mpl::int_<0>
> length;
// ...
Чтобы не повторять одну и ту же обертку для каждого элемента последовательности, MPL предоставляет интегральные обертки последовательностей, которые позволяют писать так:
#include <boost/mpl/vector_c.hpp>
typedef mpl::vector_c<int,1,0,0,0,0,0,0> mass;
typedef mpl::vector_c<int,0,1,0,0,0,0,0> length; // or position
typedef mpl::vector_c<int,0,0,1,0,0,0,0> time;
typedef mpl::vector_c<int,0,0,0,1,0,0,0> charge;
typedef mpl::vector_c<int,0,0,0,0,1,0,0> temperature;
typedef mpl::vector_c<int,0,0,0,0,0,1,0> intensity;
typedef mpl::vector_c<int,0,0,0,0,0,0,1> angle
Теперь можно определить несколько составных размерностей:
// base dimension: m l t ...
typedef mpl::vector_c<int,0,1,-1,0,0,0,0> velocity; // l/t
typedef mpl::vector_c<int,0,1,-2,0,0,0,0> acceleration; // l/(t2)
typedef mpl::vector_c<int,1,1,-1,0,0,0,0> momentum; // m*l/t
typedef mpl::vector_c<int,1,1,-2,0,0,0,0> force; // m*l/(t2)
Размерности скаляров (таких как пи) могут быть описаны как:
typedef mpl::vector_c<int,0,0,0,0,0,0,0> scalar;
