- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
(Переменная последовательность)
Описание:
Переменная последовательность является элементом семейства классов последовательностей с двумя формами: переменной и пронумерованной. Если seq является обобщенным именем для некоторой переменной последовательности, его переменная форма позволяет задавать последовательность из n элементов: t1, t2, ... tn, для любого n от 0 до значения макроса BOOST_MPL_LIMIT_seq_SIZE, используя следующие обозначения:
seq<t1, t2, ... tn>
В отличие от этого, каждая пронумерованная форма поддерживает точное количество элементов, которые закодированы в название соответствующего шаблон класса:
seqn<t1, t2, ... tn>
Для пронумерованной формы нет предопределенного верхнего предела для n, кроме допустимого количества шаблонных параметров конкретным компилятором.
Требования к выражениям:
В следующей таблице и спецификациях, seq является меткой-заполнителем (placeholder) для текущего имени переменной последовательности.
Выражение |
Тип |
Сложность |
seq<t1, t2, ... tn> |
Forward Sequence |
Амортизированное постоянное время. |
seq<t1, t2, ... tn>::type |
Forward Sequence |
Амортизированное постоянное время. |
seqn<t1, t2, ... tn> |
Forward Sequence |
Амортизированное постоянное время. |
seqn<t1, t2, ... tn>::type |
Forward Sequence |
Амортизированное постоянное время. |
Семантика выражений:
typedef seq<t1, t2, ... tn> s;
typedef seqn<t1, t2, ... tn> s;
Семантика: s это последовательность элементов t1, t2, ... tn.
Постусловие:
size<s>::value == n.
typedef seq<t1, t2, ... tn> s;
typedef seqn<t1, t2, ... tn> s;
Семантика: s идентична
seqn<t1, t2, ... tn>
Постусловие:
size<s>::value == n.
Модели:
vector
list
set
Смотри также:
Sequences, Configuration, Integral Sequence Wrapper
Классы
MPL содержит большое количество классов последовательностей общего назначения, охватывающих большинство типичных задач метапрограммирования.
vector
Описание:
Вектор является последовательностью (переменной, произвольного доступа, расширяемой) типов, поддерживающей постоянное время вставки и удаления
элементов на обоих концах, и линейное время вставки и удаления элементов в середине. На компиляторах, которые поддерживают расширение typeof, вектор является самой простой и во многих случаях наиболее эффективной последовательностью.
Заголовок:
Форма последовательности |
Заголовочный файл |
Variadic |
#include <boost/mpl/vector.hpp> |
Numbered |
#include <boost/mpl/vector/vectorn.hpp> |
Модель:
Variadic Sequence
Random Access Sequence
Extensible Sequence
Back Extensible Sequence
Front Extensible Sequence
Семантика выражений:
В следующей таблице, v - экземпляр вектора, pos и last - итераторы в v, r – прямая последовательность, n - интегральная константа, а х и t1, t2, ... tn - произвольные типы.
Выражение |
Семантика |
vector<t1, t2, ... tn> vectorn<t1, t2, ... tn> |
Вектор из t1, t2, ... tn элементов; Смотри Variadic Sequence. |
vector<t1, t2, ... tn>::type vectorn<t1, t2, ... tn>::type |
Идентично vectorn<t1, t2, ... tn>; Смотри Variadic Sequence. |
begin<v>::type |
Итератор указывает на начало v; смотри Random Access Sequence. |
end<v>::type |
Итератор указывает на конец v; смотри Random Access Sequence. |
size<v>::type |
Размер v; смотри Random Access Sequence. |
empty<v>::type |
Булева интегральная константа с, для которой c::value == true, если и только если последовательность пуста (empty).смотри Random Access Sequence. |
front<v>::type |
Первый элемент в v; смотри Random Access Sequence. |
back<v>::type |
Последний элемент в v; смотри Random Access Sequence. |
at<v,n>::type |
n-ый элемент от начала v; смотри Random Access Sequence. |
insert<v,pos,x>::type |
Новый vector из следующих элементов: [begin<v>::type, pos), x,[pos, end<v>::type); смотри Extensible Sequence. |
insert_range<v,pos,r>::type |
Новый vector из следующих элементов: [begin<v>::type, pos),[begin<r>::type, end<r>::type), [pos, end<v>::type); смотри Extensible Sequence. |
erase<v,pos>::type |
Новый vector из следующих элементов: [begin<v>::type, pos),[next<pos>::type, end<v>::type); смотри Extensible Sequence. |
erase<v,pos,last>::type |
Новый vector из следующих элементов: [begin<v>::type, pos),[last, end<v>::type); смотри Extensible Sequence. |
clear<v>::type |
Пустой (empty) vector; смотри Extensible Sequence. |
push_back<v,x>::type |
Новый vector из следующих элементов: [begin<v>::type, end<v>::type), x; смотри Back Extensible Sequence. |
pop_back<v>::type |
Новый vector из следующих элементов: [begin<v>::type, prior<end<v>::type>::type); смотри Back Extensible Sequence. |
push_front<v,x>::type |
Новый vector из следующих элементов: [begin<v>::type,end<v>:: type), x; смотри Front Extensible Sequence. |
pop_front<v>::type |
Новый vector из следующих элементов: [next< begin<v>::type>::type, end<v>::type); смотри Front Extensible Sequence. |
Пример:
int main()
{
typedef mpl::vector<int, float, double> floats;
cout << typeid(floats::item2).name() << endl;
typedef mpl::push_back<floats,int>::type types;
BOOST_MPL_ASSERT((boost::is_same<mpl::at_c<types,3>::type, int>));
cout << typeid(types::item3).name() << endl;
return 0;
}
Смотри также:
Sequences, Variadic Sequence, Random Access Sequence, Extensible Sequence, vector_c, list
list
Описание:
Список является последовательностью (переменной, прямой, расширяемой) типов, поддерживающей постоянное время вставки и удаления элементов в начале, и линейное время вставки и удаления элементов в конце и в середине.
Заголовок:
Форма последовательности |
Заголовочный файл |
Variadic |
#include <boost/mpl/list.hpp> |
Numbered |
#include <boost/mpl/list/listn.hpp> |
Модель:
Variadic Sequence
Forward Sequence
Extensible Sequence
Front Extensible Sequence
Семантика выражений:
В следующей таблице, l - экземпляр списка, pos и last - итераторы в l, r – прямая последовательность, х и t1, t2, ... tn - произвольные типы.
Выражение |
Семантика |
list<t1, t2, ... tn> listn<t1, t2, ... tn> |
Список из t1, t2, ... tn элементов; Смотри Variadic Sequence. |
list<t1, t2, ... tn>::type listn<t1, t2, ... tn>::type |
Идентично listn<t1, t2, ... tn>; Смотри Variadic Sequence. |
begin<l>::type |
Итератор указывает на начало l; смотри Forward Sequence. |
end<l>::type |
Итератор указывает на конец l; смотри Forward Sequence. |
size<l>::type |
Размер l; смотри Forward Sequence. |
empty<l>::type |
Булева интегральная константа с, для которой c::value == true, если и только если последовательность пуста (empty). смотри Forward Sequence. |
front<l>::type |
Первый элемент в l; смотри Forward Sequence. |
insert<l,pos,x>::type |
Новый list из следующих элементов: [begin<l>::type, pos), x,[pos, end<l>::type); смотри Extensible Sequence. |
insert_range<l,pos,r>::type |
Новый list из следующих элементов: [begin<l>::type, pos),[begin<r>::type, end<r>::type), [pos, end<l>::type); смотри Extensible Sequence. |
erase<l,pos>::type |
Новый list из следующих элементов: [begin<l>::type, pos),[next<pos>::type, end<l>::type); смотри Extensible Sequence. |
erase<l,pos,last>::type |
Новый list из следующих элементов: [begin<l>::type, pos),[last, end<l>::type); смотри Extensible Sequence. |
clear<l>::type |
Пустой (empty) list; смотри Extensible Sequence. |
push_front<l,x>::type |
Новый list, в котором x является первым элементом: смотри Front Extensible Sequence. |
pop_front<l>::type |
Новый list из всех элементов без первого: смотри Front Extensible Sequence. |
Пример:
#include <boost\mpl\list.hpp>
#include <boost\mpl\push_front.hpp>
#include <boost\assert.hpp>
#include <boost\mpl\at.hpp>
#include <boost\mpl\front.hpp>
using namespace boost;
int main()
{
typedef mpl::list<int, float, double> floats;
cout << typeid(mpl::at<floats, mpl::int_<2>>::type).name() << endl;
typedef mpl::push_front<floats, int>::type types;
BOOST_MPL_ASSERT((boost::is_same<mpl::front<types>::type, int>));
cout << typeid(mpl::at<types, mpl::int_<2>>::type).name() << endl;
return 0;
}
Смотри также:
Sequences, Variadic Sequence, Forward Sequence, Extensible Sequence, vector, list_c
deque
Описание:
Двухсторонняя очередь - последовательность (переменной, произвольного доступа, расширяемой) типов, которая поддерживает постоянное время вставки и удаления элементов с обоих концов, и линейное время вставки и удаления элементов в середине. В этой реализации библиотеки, двухсторонняя очередь - синоним вектора.
Заголовок:
#include <boost/mpl/deque.hpp>
Модель:
Variadic Sequence
Random Access Sequence
Extensible Sequence
Back Extensible Sequence
Front Extensible Sequence
Семантика выражений:
Смотри спецификации vector.
Пример:
#include <boost\mpl\deque.hpp>
#include <boost\mpl\push_back.hpp>
#include <boost\assert.hpp>
#include <boost\mpl\at.hpp>
using namespace boost;
int main()
{
typedef mpl::deque<int, float, double> floats;
cout << typeid(floats::item2).name() << endl;
typedef mpl::push_back<floats,int>::type types;
BOOST_MPL_ASSERT((boost::is_same<mpl::at_c<types,3>::type, int>));
cout << typeid(types::item3).name() << endl;
return 0;
}
Смотри также:
Sequences, vector, list, set.
set
Описание:
Множество - последовательность (переменная, ассоциативная, расширяемая) типов, поддерживающая постоянное время вставки и удаления элементов, проверяет наличие элементом в множестве. Множество может содержать не более одного элемента для каждого ключа.
Заголовок:
Форма последовательности |
Заголовочный файл |
Variadic |
#include <boost/mpl/set.hpp> |
Numbered |
#include <boost/mpl/set/setn.hpp> |
Модель:
Variadic Sequence
Associative Sequence
Extensible Associative Sequence
Семантика выражений:
В следующей таблице, s - экземпляр множества, pos - итераторы в s, а k, х и t1, t2, ... tn - произвольные типы.
Выражение |
Семантика |
set<t1, t2, ... tn> setn<t1, t2, ... tn> |
Множество из t1, t2, ... tn элементов; Смотри Variadic Sequence. |
set <t1, t2, ... tn>::type setn<t1, t2, ... tn>::type |
Идентично setn<t1, t2, ... tn>; Смотри Variadic Sequence. |
begin<s>::type |
Итератор указывает на начало s; смотри Associative Sequence. |
end<s>::type |
Итератор указывает на конец s; смотри Associative Sequence. |
size<s>::type |
Размер s; смотри Associative Sequence. |
empty<s>::type |
Булева интегральная константа с, для которой c::value == true, если и только если s пуст (empty).смотри Random Access Sequence. |
front<s>::type |
Первый элемент в s; смотри Associative Sequence. |
has_key<s,k>::type |
Булевская интегральная константа c, для которой c::value == true, если и только если, есть один или больше элементов, с ключом (key) k в s; смотри Associative Sequence. |
count<s,k>::type |
Количество элементов с ключом (key) k в s; смотри Associative Sequence. |
order<s,k>::type |
Уникальная беззнаковая интегральная константа, ассоциированная с ключом (key) k в s; смотри Associative Sequence. |
at<s,k>::type at<s,k,def>::type |
Первый элемент, ассоциированный с ключом (key) k в s; смотри Associative Sequence. |
key_type<s,x>::type |
Ключ (key) для элемента x, используемый для идентификации x в s; |
value_type<s,x>::type |
Значение (value) для элемента x, используемый для x в s; |
insert<s,x>::type |
Новый set эквивалентный s, кроме at<t, key_type<s,x>::type>::type что идентично value_type<s,x>::type. |
insert<s,pos,x>::type |
Эквивалентно insert<s,x>::type; pos игнорируется. |
erase_key<s,k>::type |
Новый set эквивалентный s, кроме has_key<t, k>::value == false. |
erase<v,pos>::type |
Эквивалентно erase<s, deref<pos>::type>::type. |
clear<v>::type |
Пустой (empty) set; |
Пример:
#include <boost\mpl\set.hpp>
#include <boost\assert.hpp>
#include <boost\mpl\size.hpp>
#include <boost\mpl\empty.hpp>
#include <boost\mpl\at.hpp>
#include <boost\mpl\key_type.hpp>
using namespace boost;
int main()
{
typedef mpl::set<int,long,double,mpl::int_<5>> s;
BOOST_MPL_ASSERT_RELATION(mpl::size<s>::value, ==, 4);
BOOST_MPL_ASSERT_NOT((mpl::empty<s>));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<s,int>::type, int > ));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<s,long>::type, long > ));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<s,mpl::int_<5>>::type, mpl::int_<5>>));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<s,char>::type, mpl::void_>));
return 0;
}
Смотри также:
Sequences, Variadic Sequence, Associative Sequence, Extensible Associative Sequence, set_c, map, vector
map
Описание:
Карта является последовательностью (переменной, произвольного доступа, расширяемой) типов, поддерживающей постоянное время вставки и удаления элементов, проверяет наличие элементом в карте. Карта может содержать не более одного элемента для каждого ключа.
Заголовок:
Форма последовательности |
Заголовочный файл |
Variadic |
#include <boost/mpl/map.hpp> |
Numbered |
#include <boost/mpl/map/mapn.hpp> |
Модель:
Variadic Sequence
Associative Sequence
Extensible Associative Sequence
Семантика выражений:
В следующей таблице и спецификациях, m - экземпляр map, pos - итератор в map, х и p1, p2,…pn являются парами (pairs), а к - произвольный тип.
Выражение |
Семантика |
map<p1, p2, ... pn> mapn<p1, p2, ... pn> |
Карта из p1, p2, ... pn элементов; Смотри Variadic Sequence. |
map<p1, p2, ... pn>::type mapn<p1, p2, ... pn>::type |
Идентично mapn<p1, p2, ... pn>; Смотри Variadic Sequence. |
begin<m>::type |
Итератор указывает на начало m; смотри Associative Sequence. |
end<m>::type |
Итератор указывает на конец m; смотри Associative Sequence. |
size<m>::type |
Размер m; смотри Associative Sequence. |
empty<m>::type |
Булева интегральная константа с, для которой c::value == true, если и только если m пуст (empty). смотри Associative Sequence. |
front<m>::type |
Первый элемент в m; смотри Associative Sequence. |
has_key<m,k>::type |
Булевская интегральная константа c, для которой c::value == true, если и только если, есть один или больше элементов, с ключом (key) k в m; смотри Associative Sequence. |
count<m,k>::type |
Количество элементов с ключом (key) k в m; смотри Associative Sequence. |
order<m,k>::type |
Уникальная беззнаковая интегральная константа, ассоциированная с ключом (key) k в m; смотри Associative Sequence. |
at<m,k>::type at<m,k,def>::type |
Первый элемент, ассоциированный с ключом (key) k в m; смотри Associative Sequence. |
key_type<m,x>::type |
Идентично x::first в m; смотри Associative Sequence. |
value_type<m,x>::type |
Идентично x::second в m; смотри Associative Sequence. |
insert<s,x>::type |
Новый map эквивалентный m, кроме at<t, key_type<m,x>::type>::type что идентично value_type<m,x>::type. |
insert<m,pos,x>::type |
Эквивалентно insert<m,x>::type; pos игнорируется. |
erase_key<m,k>::type |
Новый map эквивалентный m, кроме has_key<t, k>::value == false. |
erase<m,pos>::type |
Эквивалентно erase<m, deref<pos>::type>::type. |
clear<m>::type |
Пустой (empty) map; |
Пример:
int main()
{
typedef mpl::map<
mpl::pair<int, unsigned>,
mpl::pair<char, unsigned char>,
mpl::pair<mpl::long_<5>, char[17]>,
mpl::pair<int[42], bool>
> m;
BOOST_MPL_ASSERT_RELATION(mpl::size<m>::value, ==, 4);
BOOST_MPL_ASSERT_NOT(( mpl::empty<m> ));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<m,int>::type, unsigned > ));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<m,mpl::long_<5>>::type, char[17]>));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<m,int[42]>::type, bool > ));
BOOST_MPL_ASSERT((boost::is_same<mpl::at<m,long>::type, mpl::void_>));
return 0;
}
Смотри также:
Sequences, Variadic Sequence, Associative Sequence, Extensible Associative Sequence, set, vector
range_c
Формат:
template<
typename T,
T Start,
T Finish
>
struct range_c
{
typedef integral_c<T,Start> start;
typedef integral_c<T,Finish> finish;
// unspecified
// ...
};
Описание:
Range_c - отсортированная последовательность произвольного доступа из интегральных констант. Поскольку данная последовательность не является расширяемой, то нельзя использовать напрямую метафункции, создающие последовательности, такие push_front и алгоритмы преобразования, такие как replace, для их использования, необходимо скопировать содержимое диапазона в более подходящую последовательность.
Заголовок:
#include <boost/mpl/range_c.hpp>
Модель:
Random Access Sequence
Семантика выражений:
В следующей таблице, r - экземпляр range_c, T – произвольный интегральный тип, n и m – значения интегральных констант типа Т.
Выражение |
Семантика |
range_c<T,n,m> range_c<T,n,m>::type |
Отсортированная последовательность произвольного доступа из оберток для интегральных констант с полуоткрытым диапазоном значений [n, m): integral_c<T,n>, integral_c<T,n+1>,... integral_c<T,m-1>.
|
begin<r>::type |
Итератор указывает на начало r; смотри Random Access Sequence. |
end<r>::type |
Итератор указывает на конец r; смотри Random Access Sequence. |
size<r>::type |
Размер r; смотри Random Access Sequence. |
empty<r>::type |
Булева интегральная константа с, для которой c::value == true, если и только если r пуст (empty).смотри Random Access Sequence. |
front<r>::type |
Первый элемент в r; смотри Random Access Sequence. |
back<r>::type |
Последний элемент в r; смотри Random Access Sequence. |
at<v,n>::type |
n-ый элемент от начала r; смотри Random Access Sequence. |
Пример:
int main()
{
typedef mpl::range_c<int,0,0> range0;
typedef mpl::range_c<int,0,1> range1;
typedef mpl::range_c<int,0,10> range10;
BOOST_MPL_ASSERT_RELATION(mpl::size<range0>::value, ==, 0 );
BOOST_MPL_ASSERT_RELATION(mpl::size<range1>::value, ==, 1 );
BOOST_MPL_ASSERT_RELATION(mpl::size<range10>::value, ==, 10 );
BOOST_MPL_ASSERT((mpl::empty<range0> ));
BOOST_MPL_ASSERT_NOT((mpl::empty<range1> ));
BOOST_MPL_ASSERT_NOT((mpl::empty<range10> ));
BOOST_MPL_ASSERT((boost::is_same<mpl::begin<range0>::type, mpl::end<range0>::type>));
BOOST_MPL_ASSERT_NOT((boost::is_same<mpl::begin<range1>::type, mpl::end<range1>::type>));
BOOST_MPL_ASSERT_NOT((boost::is_same<mpl::begin<range10>::type, mpl::end<range10>::type>));
BOOST_MPL_ASSERT_RELATION(mpl::front<range1>::type::value, ==, 0 );
//BOOST_MPL_ASSERT_RELATION(mpl::back<range1>::type::value, ==, 0 ); // ошибка компиляции
BOOST_MPL_ASSERT_RELATION(mpl::front<range10>::type::value, ==, 0 );
//BOOST_MPL_ASSERT_RELATION(mpl::back<range10>::type::value, ==, 9 ); // ошибка компиляции
return 0;
}
Смотри также:
Sequences, Random Access Sequence, vector_c, set_c, list_c
vector_c
Описание:
Vector_c – обертка интегральной последовательности для vector. Vector_c разделяет все характеристики и требования vector, и отличается только способом определения исходной последовательности.
Заголовок:
Форма последовательности |
Заголовочный файл |
Variadic |
#include <boost/mpl/vector_c.hpp> |
Numbered |
#include <boost/mpl/vector/vectorn_c.hpp> |
Модель:
Integral Sequence Wrapper
Variadic Sequence
Random Access Sequence
Extensible Sequence
Back Extensible Sequence
Front Extensible Sequence
Семантика выражений:
Поддерживает семантику, определенную для vector, добавляет отличные/не определенные выражения:
Выражение |
Семантика |
vector_c<T,c1, c2,... cn> vectorn_c<T,c1, c2,... cn> |
Вектор из интегральных константных оберток integral_c<T,c1>, integral_c<T,c2>, ... integral_c<T,cn>; смотри Integral Sequence Wrapper. |
vector_c<T,c1, c2,... cn>::type vectorn_c<T,c1, c2,... cn>::type |
Идентично vectorn<integral_c<T,c1>, integral_c<T,c2>, ... integral_c<T,cn>>; смотри Integral Sequence Wrapper. |
vector_c<T,c1, c2,... cn>::value_type vectorn_c<T,c1, c2,... cn>::value_type |
Идентично Т; смотри Integral Sequence Wrapper. |
Пример:
#include <boost\mpl\vector_c.hpp>
#include <boost\mpl\push_back.hpp>
#include <boost\assert.hpp>
#include <boost\mpl\at.hpp>
#include <boost\mpl\front.hpp>
#include <boost\mpl\back.hpp>
using namespace boost;
int main()
{
typedef mpl::vector_c<int,1,2,3,5,8,13,21,34> fibonacci;
typedef mpl::push_back<fibonacci,mpl::int_<55>>::type fibonacci2;
BOOST_MPL_ASSERT_RELATION(mpl::front<fibonacci2>::type::value, ==, 1 );
BOOST_MPL_ASSERT_RELATION(mpl::back<fibonacci2>::type::value, ==, 55 );
return 0;
}
Смотри также:
Sequences, Integral Sequence Wrapper, vector, integral_c, set_c, list_c, range_c
list_c
Описание:
List_c – обертка интегральной последовательности для list. List_c разделяет все характеристики и требования list, и отличается только способом определения исходной последовательности.
Заголовок:
Форма последовательности |
Заголовочный файл |
Variadic |
#include <boost/mpl/list_c.hpp> |
Numbered |
#include <boost/mpl/list/listn_c.hpp> |
Модель:
Integral Sequence Wrapper
Variadic Sequence
Forward Sequence
Extensible Sequence
Front Extensible Sequence
Семантика выражений:
Поддерживает семантику, определенную для list, добавляет отличные/не определенные выражения:
Выражение |
Семантика |
list_c<T,c1, c2,... cn> listn_c<T,c1, c2,... cn> |
Список из интегральных константных оберток integral_c<T,c1>, integral_c<T,c2>, ... integral_c<T,cn>; смотри Integral Sequence Wrapper. |
list_c<T,c1, c2,... cn>::type listn_c<T,c1, c2,... cn>::type |
Идентично listn<integral_c<T,c1>, integral_c<T,c2>, ... integral_c<T,cn>>; смотри Integral Sequence Wrapper. |
list_c<T,c1, c2,... cn>::value_type listn_c<T,c1, c2,... cn>::value_type |
Идентично Т; смотри Integral Sequence Wrapper. |
Пример:
#include <boost\mpl\list_c.hpp>
#include <boost\mpl\push_front.hpp>
#include <boost\assert.hpp>
#include <boost\mpl\front.hpp>
using namespace boost;
int main()
{
typedef mpl::list_c<int,1,2,3,5,8,13,21,34> fibonacci;
typedef mpl::push_front<fibonacci,mpl::int_<1>>::type fibonacci2;
BOOST_MPL_ASSERT_RELATION(mpl::front<fibonacci2>::type::value, ==, 1 );
return 0;
}
Смотри также:
Sequences, Integral Sequence Wrapper, list, integral_c, vector_c, set_c, range_c
set_c
Описание:
Set_c – обертка интегральной последовательности для set. Set_c разделяет все характеристики и требования set, и отличается только способом определения исходной последовательности.
Заголовок:
Форма последовательности |
Заголовочный файл |
Variadic |
#include <boost/mpl/set_c.hpp> |
Numbered |
#include <boost/mpl/set/setn_c.hpp> |
Модель:
Variadic Sequence
Associative Sequence
Extensible Associative Sequence
Семантика выражений:
Поддерживает семантику, определенную для set, добавляет отличные/не определенные выражения:
Выражение |
Семантика |
set_c<T,c1, c2,... cn> setn_c<T,c1, c2,... cn> |
Множество из интегральных константных оберток integral_c<T,c1>, integral_c<T,c2>, ... integral_c<T,cn>; смотри Integral Sequence Wrapper. |
set_c<T,c1, c2,... cn>::type setn_c<T,c1, c2,... cn>::type |
Идентично setn<integral_c<T,c1>, integral_c<T,c2>, ... integral_c<T,cn>>; смотри Integral Sequence Wrapper. |
set_c<T,c1, c2,... cn>::value_type setn_c<T,c1, c2,... cn>::value_type |
Идентично Т; смотри Integral Sequence Wrapper. |
Пример:
#include <boost\assert.hpp>
#include <boost\mpl\set_c.hpp>
#include <boost\mpl\push_front.hpp>
#include <boost\mpl\size.hpp>
#include <boost\mpl\empty.hpp>
#include <boost\mpl\integral_c.hpp>
#include <boost\mpl\has_key.hpp>
using namespace boost;
int main()
{
typedef mpl::set_c<int,1,3,5,7,9> odds;
BOOST_MPL_ASSERT_RELATION(mpl::size<odds>::value, ==, 5 );
BOOST_MPL_ASSERT_NOT((mpl::empty<odds> ));
BOOST_MPL_ASSERT((mpl::has_key< odds, mpl::integral_c<int,5> > ));
BOOST_MPL_ASSERT_NOT((mpl::has_key< odds, mpl::integral_c<int,4> > ));
BOOST_MPL_ASSERT_NOT((mpl::has_key< odds, mpl::integral_c<int,15> > ));
return 0;
}
Смотри также:
Sequences, Integral Sequence Wrapper, set, integral_c, vector_c, list_c, range_c
