- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Представления
(views)
Представления - адаптер последовательности, предоставляющий измененное представление одной или более базовых последовательностей. Представления являются «ленивыми» - элементы вычисляются только по требованию. Подобно сокращенным логическим операциям и eval_if, представления позволяют избежать преждевременных ошибок и неэффективных вычислений, результаты которых никогда не будут использоваться. С помощью представлений многие алгоритмические проблемы могут быть решены в более простым, концептуально точным и выразительным способом.
empty_sequence
Фомрат:
struct empty_sequence
{
// unspecified
// ...
};
Описание:
Представляет последовательность без элементов.
Заголовок:
#include <boost/mpl/empty_sequence.hpp>
Семантика выражений:
Поддерживает семантику, определенную для последовательностей произвольного доступа, добавляет отличные/не определенные выражения.
В следующей таблице, s - экземпляр empty_sequence.
Выражение |
Семантика |
empty_sequence |
Пустая последовательность произвольного доступа. |
size<s>::type |
size<s>::value == 0; смотри Random Access Sequence. |
Пример:
#include <boost\assert.hpp>
#include <boost\mpl\empty_sequence.hpp>
#include <boost\mpl\begin.hpp>
#include <boost\mpl\end.hpp>
#include <boost\mpl\transform_view.hpp>
#include <boost\mpl\size.hpp>
using namespace boost;
int main()
{
typedef mpl::begin<mpl::empty_sequence>::type first;
typedef mpl::end<mpl::empty_sequence>::type last;
BOOST_MPL_ASSERT((boost::is_same<first,last> ));
BOOST_MPL_ASSERT_RELATION(mpl::size<mpl::empty_sequence>::value, ==, 0 );
typedef mpl::transform_view<
mpl::empty_sequence,
add_pointer<mpl::_>
> empty_view;
BOOST_MPL_ASSERT_RELATION(mpl::size<mpl::empty_sequence>::value, ==, 0 );
return 0;
}
Смотри также:
Sequences, Views, vector, list, single_view
filter_view
Фомрат:
template
<
typename Sequence,
typename Pred
>
struct filter_view
{
// unspecified
// ...
};
Описание:
Представление в подмножестве элементов последовательности, удовлетворяющих предикату Pred.
Заголовок:
#include <boost/mpl/filter_view.hpp>
Модель:
Forward Sequence
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность (Forward Sequence)
|
Последовательность для обертки. |
Pred |
Унарное лямбда-выражение (Unary Lambda Expression) |
Предикат-фильтр.
|
Семантика выражений:
Поддерживает семантику, определенную для прямой последовательности, добавляет отличные/не определенные выражения.
В следующей таблице, v - экземпляр filter_view, s - произвольная прямая последовательность, pred – унарное лямбда-выражение.
Выражение |
Семантика |
filter_view<s,pred> filter_view<s,pred>::type |
Ленивая прямая последовательность из всех элементов в диапазоне [begin<s>::type, end<s>::type) для которых pred возаращает правду. |
size<s>::type |
Размер v; size<v>::value == count_if<s,pred>::value; линейная сложность; смотри Forward Sequence.
|
Пример:
Поиск наибольшего дробного типа в последовательности.
#include <boost\assert.hpp>
#include <boost\mpl\vector.hpp>
#include <boost\mpl\max_element.hpp>
#include <boost\mpl\transform_view.hpp>
#include <boost\mpl\filter_view.hpp>
#include <boost\type_traits\is_float.hpp>
#include <boost\mpl\sizeof.hpp>
#include <boost\mpl\deref.hpp>
using namespace boost;
int main()
{
typedef mpl::vector<int,float,long,float,char[50],long double,char> types;
typedef mpl::max_element<
mpl::transform_view<
mpl::filter_view<
types,
boost::is_float<mpl::_>
>,
mpl::sizeof_<mpl::_>
>
>::type iter;
BOOST_MPL_ASSERT((boost::is_same<mpl::deref<iter::base>::type, long double>));
return 0;
}
Смотри также:
Sequences, Views, transform_view, joint_view, zip_view, iterator_range
iterator_range
Фомрат:
template
<
typename First,
typename Last
>
struct iterator_range
{
// unspecified
// ...
};
Описание:
Представляет подмножество последовательности элементов, определенных парой итераторов.
Заголовок:
#include <boost/mpl/fold.hpp>
Модель:
Forward Sequence,
Bidirectional Sequence, или
Random Access Sequence, зависит от категории базовых итераторов.
Параметры:
Выражение |
Требование |
Описание |
First, Last |
Forward Iterator |
Итераторы определяют границы представления. |
Семантика выражений:
Поддерживает семантику, определенную для прямой последовательности, добавляет отличные/не определенные выражения.
В следующей таблице, v - экземпляр iterator_range, first и last – итераторы в прямой последовательности, [first, last) - форма действительного диапазона.
Выражение |
Семантика |
iterator_range<first,last> iterator_range<first,last>::type |
Ленивая последовательность всех элементов в диапазоне [first, last). |
Пример:
int main()
{
typedef mpl::range_c<int,0,100> r;
typedef mpl::advance_c<mpl::begin<r>::type, 10>::type first;
typedef mpl::advance_c<mpl::end<r>::type,-10>::type last;
BOOST_MPL_ASSERT
((
mpl::equal<mpl::iterator_range<first,last>, mpl::range_c<int,10,90>>
));
return 0;
}
Смотри также:
Sequences, Views, filter_view, transform_view, joint_view, zip_view, max_element
joint_view
Фомрат:
template
<
typename Sequence1,
typename Sequence2
>
struct joint_view
{
// unspecified
// ...
};
Описание:
Представление в последовательности элементов, сформированных путем объединения Sequence1 и Sequence2.
Заголовок:
#include <boost/mpl/joint_view.hpp>
Модель:
Forward Sequence
Параметры:
Выражение |
Требование |
Описание |
Sequence1, Sequence2 |
Forward Sequence |
Последовательности для создания представления. |
Семантика выражений:
Поддерживает семантику, определенную для прямой последовательности, добавляет отличные/не определенные выражения.
В следующей таблице, v - экземпляр joint_view, s1 и s2 произвольные прямые последовательности.
Выражение |
Семантика |
joint_view<s1,s2> joint_view<s1,s2>::type |
Ленивая прямая последовательность всех элементов в диапазоне [begin<s1>::type, end<s1>::type), [begin<s2>::type, end<s2>::type).
|
size<s>::type |
Размер v; size<v>::value == size<s1>::value + size<s2>::value; линейная сложность; смотри Forward Sequence. |
Пример:
#include <boost\assert.hpp>
#include <boost\mpl\joint_view.hpp>
#include <boost\mpl\range_c.hpp>
#include <boost\mpl\advance.hpp>
#include <boost\mpl\equal.hpp>
using namespace boost;
int main()
{
typedef mpl::joint_view<
mpl::range_c<int,0,10>,
mpl::range_c<int,10,15>
> numbers;
BOOST_MPL_ASSERT((mpl::equal<numbers, mpl::range_c<int,0,15>>));
return 0;
}
Смотри также:
Sequences, Views, filter_view, transform_view, zip_view, iterator_range
single_view
Фомрат:
template<typename T>
struct single_view
{
// unspecified
// ...
};
Описание:
Представление произвольного типа Т, как последовательности из одного элемента.
Заголовок:
#include <boost/mpl/single_view.hpp>
Модель:
Random Access Sequence
Параметры:
Выражение |
Требование |
Описание |
T |
Любой тип |
Тип, оборачиваемый в последовательность. |
Семантика выражений:
Поддерживает семантику, определенную для последовательности произвольного доступа, добавляет отличные/не определенные выражения.
В следующей таблице, v - экземпляр single_view, x – произвольный тип.
Выражение |
Семантика |
single_view<x> single_view<x>::type |
Последовательность произвольного доступа v из одного элемента, такая что front<v>::type идентичен x. |
size<s>::type |
Размер v; size<v>::value == 1; смотри Random Access Sequence. |
Пример:
#include <boost\assert.hpp>
#include <boost\static_assert.hpp>
#include <boost\mpl\single_view.hpp>
#include <boost\mpl\begin.hpp>
#include <boost\mpl\end.hpp>
#include <boost\mpl\deref.hpp>
#include <boost\mpl\next.hpp>
#include <boost\mpl\prior.hpp>
#include <boost\mpl\size.hpp>
using namespace boost;
int main()
{
typedef mpl::single_view<int> view;
typedef mpl::begin<view>::type first;
typedef mpl::end<view>::type last;
BOOST_MPL_ASSERT((is_same<mpl::deref<first>::type,int>));
BOOST_MPL_ASSERT((is_same<mpl::next<first>::type,last>));
BOOST_MPL_ASSERT((is_same<mpl::prior<last>::type,first>));
BOOST_MPL_ASSERT_RELATION(mpl::size<view>::value, ==, 1 );
return 0;
}
Смотри также:
Sequences, Views, iterator_range, filter_view, transform_view, joint_view, zip_view
transform_view
Фомрат:
template
<
typename Sequence,
typename F
>
struct transform_view
{
// unspecified
// ...
};
Описание:
Представление всего диапазона элементов преобразованной последовательности.
Заголовок:
#include <boost/mpl/transform_view.hpp>
Модель:
Forward Sequence
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Forward Sequence |
Последовательность для обертки. |
F |
Унарное лямбда-выражение |
Преобразование. |
Семантика выражений:
Поддерживает семантику, определенную для прямой последовательности, добавляет отличные/не определенные выражения.
В следующей таблице, v - экземпляр transform_view, s - произвольная прямая последовательность, f – унарное лямбда-выражение.
Выражение |
Семантика |
transform_view<s,f> transform_view<s,f>::type |
Ленивая прямая последовательность, такая что для каждого i в диапазоне [begin<v>::type, end<v>::type) и каждого j в диапазоне [begin<s>::type, end<s>::type), операция deref<i>::type идентична apply<f, deref<j>::type>::type.
|
size<s>::type |
Размер v; size<v>::value == size<s>::value; линейная сложность; смотри Forward Sequence. |
Пример:
Находит наибольший тип в последовательности.
#include <boost\assert.hpp>
#include <boost\mpl\vector.hpp>
#include <boost\mpl\max_element.hpp>
#include <boost\mpl\transform_view.hpp>
#include <boost\mpl\sizeof.hpp>
#include <boost\mpl\deref.hpp>
using namespace boost;
int main()
{
typedef mpl::vector<int,long,char,char[50],double> types;
typedef mpl::max_element<
mpl::transform_view< types, mpl::sizeof_<mpl::_> >
>::type iter;
BOOST_MPL_ASSERT_RELATION(mpl::deref<iter>::type::value, ==, 50 );
return 0;
}
Смотри также:
Sequences, Views, filter_view, joint_view, zip_view, iterator_range
zip_view
Фомрат:
template<typename Sequences>
struct zip_view
{
// unspecified
// ...
};
Описание:
Обеспечивает «сжатое» представление нескольких последовательностей, то есть, представляет собой, несколько последовательностей как элементы одной.
Заголовок:
#include <boost/mpl/zip_view.hpp>
Модель:
Forward Sequence
Параметры:
Выражение |
Требование |
Описание |
Sequences |
Прямая последовательность из прямых последовательностей |
«Сжимаемые» последовательности. |
Семантика выражений:
Поддерживает семантику, определенную для прямой последовательности, добавляет отличные/не определенные выражения.
В следующей таблице, v - экземпляр zip_view, seq – прямая последовательность из n-ого количества прямых последовательностей.
Выражение |
Семантика |
zip_view<seq> zip_view<seq>::type |
Ленивая прямая последовательность v, такая что для каждого i в диапазоне [begin<v>::type, end<v>::type) и для каждого j в диапазоне [begin<seq>::type, end<seq>::type), операция deref<i>::type идентична transform<deref<j>::type, deref<_1>>::type.
|
size<s>::type |
Размер v; size<v>::value линейная сложность; смотри Forward Sequence. |
Пример:
Поэлементная сумма трех векторов.
#include <boost\assert.hpp>
#include <boost\mpl\vector.hpp>
#include <boost\mpl\vector_c.hpp>
#include <boost\mpl\zip_view.hpp>
#include <boost\mpl\transform_view.hpp>
#include <boost\mpl\unpack_args.hpp>
#include <boost\mpl\plus.hpp>
#include <boost\mpl\equal.hpp>
#include <boost\mpl\size.hpp>
using namespace boost;
int main()
{
typedef mpl::vector_c<int,1,2,3,4,5> v1;
typedef mpl::vector_c<int,5,4,3,2,1> v2;
typedef mpl::vector_c<int,1,1,1,1,1> v3;
typedef mpl::transform_view<
mpl::zip_view<mpl::vector<v1,v2,v3>>,
mpl::unpack_args<mpl::plus<mpl::_1,mpl::_2,mpl::_3> >
> sum;
BOOST_MPL_ASSERT(( mpl::equal< sum, mpl::vector_c<int,7,7,7,7,7>> ));
typedef mpl::zip_view<mpl::vector<v1,v2,v3>> test;
return 0;
}
Смотри также:
Sequences, Views, filter_view, transform_view, joint_view, single_view, iterator_range
