- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Метафункции
advance
Фомрат:
template
<
typename Iterator,
typename N
>
struct advance
{
typedef unspecified type;
};
Описание:
Смещает итератор Iterator на расстояние N. Возвращает тип n-го элемента от начала последовательности. Для двунаправленного итератора и итератора произвольного доступа поддерживается смещение в обратную сторону.
Заголовок:
#include <boost/mpl/advance.hpp>
Параметры:
Выражение |
Требование |
Описание |
Iterator |
Прямой итератор |
Итератор для смещения |
N |
Интегральная константа |
Расстояние |
Модель:
Tag Dispatched Metafunction
Семантика выражений:
Для любого прямого итератора iter и произвольной интегральной константы n:
typedef advance<iter,n>::type j;
Возвращаемый тип: прямой итератор.
Предусловие: если итератор является прямым, то значение n::value должно быть неотрицательным.
0 <= n < size<Sequence>::value
Семантика: допустимо
typedef iter i0;
typedef next<i0>::type i1;
...
typedef next<in-1>::type j;
если значение n::value > 0, то допустимо
typedef iter i0;
typedef prior<i0>::type i1;
...
typedef prior<in-1 >::type j;
Постусловия: j – итератор: разыменованный или следующий за последним элементом. Если n::value > 0, то справедливо:
distance<iter,j>::value == n::value
в противном случае:
distance<j,iter>::value == n::value
Сложность:
Амортизированное постоянное время если iter является моделью итератора с произвольным доступом, в противном случае – линейное время.
Пример:
int main()
{
typedef mpl::range_c<int,0,10> numbers;
typedef mpl::begin<numbers>::type first;
typedef mpl::end<numbers>::type last;
typedef mpl::advance<first, mpl::int_<10> >::type i1;
typedef mpl::advance<last, mpl::int_<-10> >::type i2;
BOOST_MPL_ASSERT(( boost::is_same<i1,last> ));
BOOST_MPL_ASSERT(( boost::is_same<i2,first> ));
return 0;
};
Смотри также:
Iterators, Tag Dispatched Metafunction, distance, next
distance
Фомрат:
template
<
typename First,
typename Last
>
struct distance
{
typedef unspecified type;
};
Описание:
Возвращает интегральную константу n – значение расстояния между итераторами First и Last, для которй следующее выражение идентично итеоратору Last:
advance<First,n>::type
Заголовок:
#include <boost/mpl/distance.hpp>
Параметры:
Выражение |
Требование |
Описание |
First/Last |
Прямой итератор |
Итераторы для вычисления расстояния между собой. |
N |
Интегральная константа |
Расстояние |
Модель:
Tag Dispatched Metafunction
Семантика выражений:
Для любых прямых итераторов First и Last:
typedef distance<first,last>::type n;
Возвращаемый тип: интегральная константа.
Предусловие: [first, last) – действительный диапазон.
Семантика: эквивалентно
typedef iter_fold<
iterator_range<first,last>,
long_<0>,
next<_1>
>::type n;
Постусловия:
is_same< advance<first,n>::type, last >::value == true.
Сложность:
Амортизированное постоянное время если итераторы First и Last являются итераторами с произвольным доступом, в противном случае – линейное время.
Пример:
int main()
{
typedef mpl::range_c<int,0,10>::type range;
typedef mpl::begin<range>::type first;
typedef mpl::end<range>::type last;
BOOST_MPL_ASSERT_RELATION(( mpl::distance<first,last>::value), ==, 10);
return 0;
};
Смотри также:
Iterators, Tag Dispatched Metafunction, advance, next, prior
next
Фомрат:
template<typename Iterator>
struct next
{
typedef unspecified type;
};
Описание:
Возвращает следующий итератор в последовательности. Для next есть несколько перегруженных версий. Например, если X является интегральной константой, то next<X> возвращает инкрементированное значение данной константы такого же типа.
Заголовок:
#include <boost/mpl/next_prior.hpp>
Параметры:
Выражение |
Требование |
Описание |
Iterator |
Прямой итератор |
Итератор для инкрементации. |
Семантика выражений:
Для любого прямого итератора iter:
typedef next<iter>::type j;
Возвращаемый тип: прямой итератор.
Предусловие: iter поддерживает инкрементацию.
Семантика: j – итератор: разыменованный или следующий за последним элементом. Если iter является итератором, определенный пользователем, то библиотека поддерживает реализацию по умолчанию, эквивалентную
typedef iter::next j;
Сложность:
Амортизированное постоянное время.
Пример:
int main()
{
typedef mpl::vector_c<int,1> v;
typedef mpl::begin<v>::type first;
typedef mpl::end<v>::type last;
BOOST_MPL_ASSERT(( boost::is_same< mpl::next<first>::type, last > ));
return 0;
};
Смотри также:
Iterators, begin / end, prior, deref
prior
Фомрат:
template<typename Iterator>
struct prior
{
typedef unspecified type;
};
Описание:
Возвращает предыдущий итератор в последовательности. Для prior есть несколько перегруженных версий. Например, если X является интегральной константой, то prior<X> возвращает декрементированное значение данной константы такого же типа.
Заголовок:
#include <boost/mpl/next_prior.hpp>
Параметры:
Выражение |
Требование |
Описание |
Iterator |
Прямой итератор |
Итератор для декрементации. |
Семантика выражений:
Для любого прямого итератора iter:
typedef prior<iter>::type j;
Возвращаемый тип: прямой итератор.
Предусловие: iter поддерживает декрементацию.
Семантика: j – итератор, указывающий на предыдущий элемент в последовательности. Если iter является итератором, определенный пользователем, то библиотека поддерживает реализацию по умолчанию, эквивалентную
typedef iter::prior j;
Сложность:
Амортизированное постоянное время.
Пример:
int main()
{
typedef mpl::vector_c<int,1> v;
typedef mpl::end<v>::type first;
typedef mpl::begin<v>::type last;
BOOST_MPL_ASSERT(( boost::is_same< mpl::prior<first>::type, last > ));
return 0;
};
Смотри также:
Iterators, begin / end, next, deref
deref
Фомрат:
template<typename Iterator>
struct deref
{
typedef unspecified type;
};
Описание:
Разыменование итератора.
Заголовок:
#include <boost/mpl/deref.hpp>
Параметры:
Выражение |
Требование |
Описание |
Iterator |
Прямой итератор |
Итератор для разыменования. |
Семантика выражений:
Для любого прямого итератора iter:
typedef deref<iter>::type t;
Возвращаемый тип: тип.
Предусловие: iter поддерживает разыменование.
Семантика: t – идентичен элементу, на который ссылается итератор iter. Если iter является итератором, определенный пользователем, то библиотека поддерживает реализацию по умолчанию, эквивалентную
typedef iter::type t;
Сложность:
Амортизированное постоянное время.
Пример:
int main()
{
typedef mpl::vector<char,short,int,long> types;
typedef mpl::begin<types>::type iter;
BOOST_MPL_ASSERT(( boost::is_same< mpl::deref<iter>::type, char > ));
return 0;
};
Смотри также:
Iterators, begin / end, next
iterator_category
Фомрат:
template<typename Iterator>
struct iterator_category
{
typedef typename Iterator::category type;
};
Описание:
Возвращает один из следующих тэков категории итератора:
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
Заголовок:
#include <boost/mpl/iterator_category.hpp>
#include <boost/mpl/iterator_tags.hpp>
Параметры:
Выражение |
Требование |
Описание |
Iterator |
Прямой итератор |
Итератор для получения категории. |
Семантика выражений:
Для любого прямого итератора iter:
typedef iterator_category<iter>::type tag;
Возвращаемый тип: интегральная константа.
Семантика:
tag - forward_iterator_tag если iter является моделью прямого итератора;
tag - bidirectional_iterator_tag если iter является моделью двунаправленного итератора;
tag - random_access_iterator_tag если iter является моделью итератора произвольного доступа;
Постусловие:
forward_iterator_tag::value < bidirectional_iterator_tag::value,
bidirectional_iterator_tag::value < random_access_iterator_tag::value.
Сложность:
Амортизированное постоянное время.
Пример:
template< typename Tag, typename Iterator >
struct algorithm_impl
{
// O(n) implementation
};
template< typename Iterator >
struct algorithm_impl<random_access_iterator_tag, Iterator>
{
// O(1) implementation
};
template< typename Iterator >
struct algorithm
: algorithm_impl<iterator_category<Iterator>::type, Iterator>
{};
Смотри также:
Iterators, begin / end, advance, distance, next
