- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Объединение множественных (мульти-) последовательностей
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Интегральные последовательности
MPL предоставялет следующие обертки дляинтегральных последовательностей: vector_c, list_c, deque_c, и set_c.
Формат:
sequence-type_c<T, n1, n2, ... nk>
Первый аргумент каждой из этих оберток – интегральный тип T, который это сохранит, и следующие аргументы – знаяения типа T.
Цель такого формата упростить следующую запись:
sequence-type<
integral_c<T,n1>
, integral_c<T,n2>
, ...
, integral_c<T,nk>
>
Это лишь демонстрация упрощения, а не полная эквивалентность записи. MPL также обеспечивает суффикс «_c» (от const) для пронумерованных последовательностей:
#include <boost/mpl/vector/vector10_c.hpp>
typedef boost::mpl::vector10_c<int,1,2,3,4,5,6,7,8,9,10> v10;
Последовательности
Если STL – это взаимосвязь обобщенных структур данных и алгоритмов, то MPL основан на алгоритмах времени компиляции, метафункциях, последовательностях и итераторах.
Контейнеры STL не являются фундаментом ее интерфейсов, в то время как в MPL последовательности напрямую связаны с работой алгоритмов.
Связующее звено работы алгоритмов и последовательностей – итераторы.
Концепции
Концепция – описание требований, налагаемых обобщенными компонентыми, которые необходимо соблюдать для их использования, например вид допустимых аргументов. Примером концепций может быть метафункция apply_helper, которая требовала, чтобы ее первым аргументом был класс метафункции.
Тип или группа типов, которая удовлетворяет требованиям концепции, моделируют ее или являются моделью понятия. Таким образом, plus_f, является моделью класса метафункции. Концепция, котороая устаналвиает требования для других концепция является надмножеством своих концепций.
Требования концепций обычно основаны на следующих категориях:
Действительность выражения
C++ выражения, которые должны быть успешно скомпилированными объектами, участвующими в выражении модели концепции. Например, от Iterator x, ожидается поддержка выражения оператора «++» и «*».
Ассоциация типов
Типы, которые участвуют в одном или больше действительном выражении и могут быть вычислены типом(ми), моделируемыми концепцией. Как правило, к ассоциированным типам можно получить доступ посредством typedef, т.к. они вложенны в определениях класса для моделированного типа или посредством класс свойств.
Инварианты
Характеристики времени выполнения инстанцируемой модели, которые должны всегда быть true. Инварианты часто имеют форму пред- и пост- условий (pre-/post- conditions). Например, после того, как Iterator будет скопирован, копия и оригинал должны быть эквивалентными.
Гарантии сложности
Гарантии того, сколько времени будет требоваться на выполнение того или иного выражения или сколько различных ресурсов будет использовать данное вычисление. Увеличивание итератора, например, обязано иметь постоянную сложность.
Итераторы
Итераторы STL и MPL не могут быть идентичными в силу природы работы с метаданными. Так, на этапе компиляции не может быть итераторов ввода и вывода.
Сложность работы итераторов времени выполнения STL постоянна - O(1), все фундаментальные итераторв MPL имеют также постоянную сложность O(1) хоть и работают во время компиляции.
Сложность операции времени компиляции может быть измерена количеством требуемых инстанцирований шаблона. Есть и другие факторы, которые определят время, требуемое для создания программы.
Каждая последующая концпеция итератора уточняет и поддерживает предыдущую, так все двунаправленные итераторы являются также и прямыми итераторами, а все итераторы произвольного доступа, явялются двунаправленными и прямыми.
Прямые
Прямой итератор - самый простой MPL итератор, который содержит лишь три операции:
Прямое перемещение;
Доступ к элементу;
Выявление категории.
MPL итератор может или быть и инкрементирован/декрементирован, или быть последним итератором последовательности. Эти два состояния для итераторов являются взаимоисключающими, т.е. изменения итератора недопустимы если он является последним.
Неизменные итераторы не могут изменяться в MPL, их нельзя увеличить способами STL, вместо этого, отни могут выступть аргументами функции смещения mpl::next, результат которой будет итератор следующего элемента последовательности. Автор функции инкрементации итератора может специализировать mpl::next для поддержки типа его итератора, или использовать реализацию по умолчанию для получения доступа к следующему элементу последовательности:
namespace boost {
namespace mpl {
template <class It> struct next
{
typedef typename It::next type;
};
}
}
Реализация по умолчанию метафункции раскрытия итератора эквивалента обращению к вложенному элементу «::type»:
namespace boost {
namespace mpl {
template <class It> struct deref
{
typedef typename It::type type;
};
}
}
Чтобы проверить итераторы на предмет равенства, используйте boost::is_same из библиотеки Boost Type Traits. Два итератора эквивалентны, только если они одного типа. Метафункция is_same также используется для сравнения итретаора с последним. Итератор j, достижим из итератора i только если они эквивалентны или ведут работу с одной последовательностью:
typedef mpl::next<i>::type i1;
typedef mpl::next<i1>::type i2;
.
.
.
typedef mpl::next<in-1>::type in;
Будем использовать нотацию «полуоткрытых диапазонов» [i, j), что обозначает диапазон элементов последовательности, начинающихся с mpl::deref<i>::type включительно и заканчивается mpl::deref <in-1>::type.
Требования MPL для прямых итераторов, где i - модель прямого итератора.
Expression |
Result |
Precondition |
mpl::next<i>::type |
A Forward Iterator. |
i is incrementable. |
mpl::deref<i>::type |
Any type. |
i is dereferenceable. |
i::category |
Convertible to mpl:: forward_iterator_tag. |
|
