- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Запрашиваемые алгоритмы
find
Фомрат:
template
<
typename Sequence,
typename T
>
struct find
{
typedef unspecified type;
};
Описание:
Возвращает итератор первого вхождения типа Т в последовательность.
Заголовок:
#include <boost/mpl/find.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность, в которой проводится поиск. |
T |
Любой тип |
Тип для поиска. |
Семантика выражений:
Для любой прямой последовательности s и произвольного типа t:
typedef find<s,t>::type i;
Возвращаемый тип: прямой итератор.
Семантика: эквивалентно
typedef find_if<s, is_same<_,t> >::type i;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<char,int,unsigned,long,unsigned long> types;
typedef mpl::find<types,unsigned>::type iter;
BOOST_MPL_ASSERT((boost::is_same< mpl::deref<iter>::type, unsigned > ));
BOOST_MPL_ASSERT_RELATION( iter::pos::value, ==, 2 );
return 0;
}
Смотри также:
Querying Algorithms, contains, find_if, count, lower_bound
find_if
Фомрат:
template
<
typename Sequence,
typename Pred
>
struct find_if
{
typedef unspecified type;
};
Описание:
Возвращает итератор первого вхождения типа Т в последовательность, для которого предикат Pred возвращает правду.
Заголовок:
#include <boost/mpl/find_if.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность, в которой проводится поиск. |
Pred |
Унарная ламбда-выражение |
Условие поиска. |
Семантика выражений:
Для любой прямой последовательности s и унарного лямбда-выражения pred:
typedef find_if<s,pred>::type i;
Возвращаемый тип: прямой итератор.
Семантика: i – первый итератор диапазона
[begin<s>::type, end<s>::type)
такой, что
apply< pred, deref<i>::type >::type::value == true
Если такой итератор не сщуествует, то i идентичен
end<s>::type
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<char,int,unsigned,long,unsigned long> types;
typedef mpl::find_if<types, boost::is_same<mpl::_1, unsigned>>::type iter;
BOOST_MPL_ASSERT(( boost::is_same< mpl::deref<iter>::type, unsigned > ));
BOOST_MPL_ASSERT_RELATION( iter::pos::value, ==, 2 );
return 0;
}
Смотри также:
Querying Algorithms, find, count_if, lower_bound
contains
Фомрат:
template
<
typename Sequence,
typename T
>
struct contains
{
typedef unspecified type;
};
Описание:
Возвращает интегральную константу true, если один или более элементов в последовательности Sequence идентичен T.
Заголовок:
#include <boost/mpl/contains.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Проверяемая последовательность. |
T |
Любой тип |
Тип для поиска. |
Семантика выражений:
Для любой прямой последовательности s и произвольного типа t:
typedef contains<s,t>::type r;
Возвращаемый тип: интегральная константа.
Семантика: эквивалентно
typedef not_<
is_same<
find<s,t>::type,
end<s>::type
>
>::type r;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<char,int,unsigned,long,unsigned long> types;
BOOST_MPL_ASSERT_NOT(( mpl::contains<types,bool> ));
return 0;
}
Смотри также:
Querying Algorithms, find, find_if, count, lower_bound
count
Фомрат:
template
<
typename Sequence,
typename T
>
struct count
{
typedef unspecified type;
};
Описание:
Возвращает количество элементов в последовательности, которые соответсвуют типу Т.
Заголовок:
#include <boost/mpl/count.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Проверяемая последовательность. |
T |
Любой тип |
Тип подсчета. |
Семантика выражений:
Для любой прямой последовательности s и произвольного типа t:
typedef count<s,t>::type n;
Возвращаемый тип: интегральная константа.
Семантика: эквивалентно
typedef count_if< s,is_same<_,T> >::type n;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<int,char,long,short,char,short,double,long> types;
typedef mpl::count<types, short>::type n;
BOOST_MPL_ASSERT_RELATION( n::value, ==, 2 );
return 0;
}
Смотри также:
Querying Algorithms, count_if, find, find_if, contains, lower_bound
count_if
Фомрат:
template
<
typename Sequence,
typename Pred
>
struct count_if
{
typedef unspecified type;
};
Описание:
Возвращает количество элементов в последовательности, для которых предикат Pred возвращает правду.
Заголовок:
#include <boost/mpl/count_if.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Проверяемая последовательность. |
Pred |
Унарное лямбда-выражение |
Условие подсчета. |
Семантика выражений:
Для любой прямой последовательности s и унарного лямбда-выражения pred:
typedef count_if<s,pred>::type n;
Возвращаемый тип: интегральная константа.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef fold<
s,
long_<0>,
if_<
apply_wrap1<p,_2>,
next<_1>,
_1
>
>::type n;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<int,char,long,short,char,long,double,long> types;
BOOST_MPL_ASSERT_RELATION
((mpl::count_if< types, boost::is_float<_> >::value), ==, 1 );
BOOST_MPL_ASSERT_RELATION
((mpl::count_if< types, boost::is_same<_,char> >::value), ==, 2 );
BOOST_MPL_ASSERT_RELATION
((mpl::count_if< types, boost::is_same<_,void> >::value), ==, 0 );
return 0;
}
Смотри также:
Querying Algorithms, count, find, find_if, contains
lower_bound
Фомрат:
template
<
typename Sequence,
typename T,
typename Pred = less<mpl::_1, mpl::_2>
>
struct lower_bound
{
typedef unspecified type;
};
Описание:
Возвращает первую позицию в отсортированной последовательности Sequence, где T может быть вставлен без нарушения упорядочения.
Заголовок:
#include <boost/mpl/lower_bound.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Отсортированная последовательность, в которой осуществляется поиск. |
T |
Любой тип |
Тип для поиска позиции. |
Pred |
Бинарное лямбда-выражение |
Критерий поиска. |
Семантика выражений:
Для любой отсортированной прямой последовательности s, бинарного лямбда-выражения pred и произвольного типа х:
typedef lower_bound<s, x, pred>::type i;
Возвращаемый тип: прямой итератор.
Семантика: i – самый дальний итератор в диапазоне
[begin<s>::type, end<s>::type)
такой, что для каждого итератора j в диапазоне
[begin<s>::type, i)
выполняется:
apply< pred, deref<j>::type, x >::type::value == true
Сложность:
Количество сравнений является логарифмическим: не более
log2(size<s>::value) + 1
Если s - последовательность произвольного доступа, то количество шагов через диапазон также логарифмическая, в противном случае число шагов, пропорциональное
Размер <s>:: значение.
size<s>::value
Пример:
int main()
{
typedef mpl::vector_c<int,1,2,3,3,3,5,8> numbers;
typedef mpl::lower_bound< numbers, mpl::int_<3> >::type iter;
BOOST_MPL_ASSERT_RELATION
((
mpl::distance<mpl::begin<numbers>::type, iter>::value), ==, 2
);
BOOST_MPL_ASSERT_RELATION( mpl::deref<iter>::type::value, ==, 3 );
return 0;
}
Смотри также:
Querying Algorithms, upper_bound, find, find_if, min_element
upper_bound
Фомрат:
template
<
typename Sequence,
typename T,
typename Pred = mpl::less<mpl::_1, mpl::_2>
>
struct upper_bound
{
typedef unspecified type;
};
Описание:
Возвращает последнюю позицию в отсортированной последовательности Sequence, где T может быть вставлен без нарушения упорядочения.
Заголовок:
#include <boost/mpl/upper_bound.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Отсортированная последовательность, в которой осуществляется поиск. |
T |
Любой тип |
Тип для поиска позиции. |
Pred |
Бинарное лямбда-выражение |
Критерий поиска. |
Семантика выражений:
Для любой отсортированной прямой последовательности s, бинарного лямбда-выражения pred и произвольного типа х:
typedef upper_bound< s,x,pred >::type i;
Возвращаемый тип: прямой итератор.
Семантика: i – самый дальний итератор в диапазоне
[begin<s>::type, end<s>::type)
такой, что для каждого итератора j в диапазоне
[begin<s>::type, i)
выполняется:
apply< pred, deref<j>::type, x >::type::value == false
Сложность:
Количество сравнений является логарифмическим: не более
log2(size<s>::value) + 1
Если s - последовательность произвольного доступа, то количество шагов через диапазон также логарифмическая, в противном случае число шагов, пропорциональное
Размер <s>:: значение.
size<s>::value
Пример:
int main()
{
typedef mpl::vector_c<int,1,2,3,3,3,5,8> numbers;
typedef mpl::upper_bound< numbers, mpl::int_<3> >::type iter;
BOOST_MPL_ASSERT_RELATION
((
mpl::distance<mpl::begin<numbers>::type, iter>::value), ==, 5
);
BOOST_MPL_ASSERT_RELATION( mpl::deref<iter>::type::value, ==, 5 );
return 0;
}
Смотри также:
Querying Algorithms, lower_bound, find, find_if, min_element
min_element
Фомрат:
template
<
typename Sequence,
typename Pred = mpl::less<mpl::_1, mpl::_2>
>
struct min_element
{
typedef unspecified type;
};
Описание:
Возвращает итератор наименьшего элемента в последовательности Sequence.
Заголовок:
#include <boost/mpl/min_element.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Отсортированная последовательность, в которой осуществляется поиск. |
Pred |
Бинарное лямбда-выражение |
Критерий сравнения. |
Семантика выражений:
Для любой прямой последовательности s, бинарного лямбда-выражения pred:
typedef min_element<s,pred>::type i;
Возвращаемый тип: прямой итератор.
Семантика: i – первый итератор в диапазоне
[begin<s>::type, end<s>::type)
такой, что для каждого итератора j в диапазоне
[begin<s>::type, i)
выполняется:
apply< pred, deref<j>::type, deref<i>::type >::type::value == false
Сложность:
Линейная. Нуль сравнений, если s – пустая последовательность, иначе количество сравнения равно:
size<s>::value - 1
Пример:
int main()
{
typedef mpl::vector<bool,char[50],long,double> types;
typedef mpl::min_element<
mpl::transform_view<
types,
mpl::sizeof_<mpl::_1>
>
>::type iter;
BOOST_MPL_ASSERT(( boost::is_same<mpl::deref<iter::base>::type, bool> ));
return 0;
}
Смотри также:
Querying Algorithms, max_element, find_if, upper_bound, find
max_element
Фомрат:
template
<
typename Sequence,
typename Pred = mpl::less<mpl::_1, mpl::_2>
>
struct max_element
{
typedef unspecified type;
};
Описание:
Возвращает итератор наибольшего элемента в последовательности Sequence.
Заголовок:
#include <boost/mpl/max_element.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Отсортированная последовательность, в которой осуществляется поиск. |
Pred |
Бинарное лямбда-выражение |
Критерий сравнения. |
Семантика выражений:
Для любой прямой последовательности s, бинарного лямбда-выражения pred:
typedef max_element<s,pred>::type i;
Возвращаемый тип: прямой итератор.
Семантика: i – первый итератор в диапазоне
[begin<s>::type, end<s>::type)
такой, что для каждого итератора j в диапазоне
[begin<s>::type, i)
выполняется:
apply< pred, deref<i>::type, deref<j>::type >::type::value == false
Сложность:
Линейная. Нуль сравнений, если s – пустая последовательность, иначе количество сравнения равно:
size<s>::value - 1
Пример:
int main()
{
typedef mpl::vector<bool,char[50],long,double> types;
typedef mpl::max_element<
mpl::transform_view<
types,
mpl::sizeof_<mpl::_1>
>
>::type iter;
BOOST_MPL_ASSERT(( boost::is_same<mpl::deref<iter::base>::type, char[50]> ));
return 0;
}
Смотри также:
Querying Algorithms, min_element, find_if, upper_bound, find
equal
Фомрат:
template
<
typename Seq1,
typename Seq2,
typename Pred = boost::is_same<mpl::_1, mpl::_2>
>
struct equal
{
typedef unspecified type;
};
Описание:
Возвращает интегральную константу true, если каждый элемент последовательности Seq1 эквивалентен каждому элементу в Seq2.
Заголовок:
#include <boost/mpl/equal.hpp>
Параметры:
Выражение |
Требование |
Описание |
Seq1, Seq2 |
Прямая последовательность |
Последовательности для сравнения. |
Pred |
Бинарное лямбда-выражение |
Критерий сравнения. |
Семантика выражений:
Для любых прямых последовательностей s1 и s2 и бинарного лямбда-выражения pred:
typedef equal<s1,s2,pred>::type c;
Возвращаемый тип: интегральная константа.
Семантика: выражение
c::value == true
только в том случае, если
size<s1>::value == size<s2>::value
а также, для любого итератора i в диапазоне
[begin<s1>::type, end<s1>::type)
выражение
deref<i>::type
идентично:
advance< begin<s2>::type, distance< begin<s1>::type,i >::type >::type
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<char,int,unsigned,long,unsigned long> s1;
typedef mpl::list<char,int,unsigned,long,unsigned long> s2;
BOOST_MPL_ASSERT(( mpl::equal<s1,s2> ));
return 0;
}
Смотри также:
Querying Algorithms, find, find_if
