- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Преобразования
Алгоритм преобразования MPL – алгоритм, создающий новую последовательность, в результате выполнения действий с элементами исходной последовательности.
Типичный алгоритм преобразования принимает одну или несколько входных последовательностей и метафункцию преобразования или предикат, а возвращает новую последовательность, созданную в соответствии с семантикой алгоритма и посредством инсертера (Inserter), который выполняет роль, аналогичную выходному итератору времени выполнения.
Для каждый алгоритма преобразования есть его реверсный аналог, с префиксом reverse_, который выполняет преобразования в обратном порядке.
copy
Фомрат:
template
<
typename Sequence,
typename In = unspecified
>
struct copy
{
typedef unspecified type;
};
Описание:
Возвращает копию исходной последовательности. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/copy.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для копирования. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s и инсертера in:
typedef copy<s,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef fold<s, in::state, in::operation>::type r;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector_c<int,0,1,2,3,4,5,6,7,8,9> numbers;
typedef mpl::copy<
mpl::range_c<int,10,20>,
mpl::back_inserter< numbers >
>::type result;
BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 20 );
BOOST_MPL_ASSERT(( mpl::equal< result, mpl::range_c<int,0,20>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_copy, copy_if, transform
copy_if
Фомрат:
template
<
typename Sequence,
typename Pred,
typename In = unspecified
>
struct copy_if
{
typedef unspecified type;
};
Описание:
Возвращает проверенную копию исходной последовательности. Копия содержит элементы, для которых предикат Pred вернул правду. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/copy_if.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для копирования. |
Pred |
Унарное лямбда-выражение |
Условие копирования. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred и инсертера in:
typedef copy_if<s,pred,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef lambda<in::operation>::type op;
typedef fold<
s,
in::state,
eval_if<
apply_wrap1<p, _2>,
apply_wrap2<op, _1, _2>,
identity<_1>
>
>::type r;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::copy_if<
mpl::range_c<int,0,10>,
mpl::less<
mpl::_1,
int_<5>
>,
mpl::back_inserter< mpl::vector<> >
>::type result;
BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 5 );
BOOST_MPL_ASSERT(( mpl::equal<result, mpl::range_c<int,0, 5>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_copy_if, copy, remove_if, replace_if
transform
Фомрат:
template
<
typename Seq,
typename Op,
typename In = unspecified
>
struct transform
{
typedef unspecified type;
};
template
<
typename Seq1,
typename Seq2,
typename BinaryOp,
typename In = unspecified
>
struct transform
{
typedef unspecified type;
};
Описание:
Алгоритм transform имеет несколько перегруженных версий:
transform<Seq,Op>: возвращает преобразованную копию исходной последовательности, полученную посредством применения унарного преобразования Op к каждому элементу в диапазоне
[begin<Sequence>::type, end<Sequence>::type)
transform<Seq1,Seq2,Op>: возвращает новую последовательность, полученную путем применения бинарного преобразования BinaryOp для пары элементов (e1, e21) из соответствующих диапазонов
[begin<Seq1>::type, end<Seq1>::type)
и
[begin<Seq2>::type, end<Seq2>::type)
[Эта формулировка относится к алгоритмам, не использующим инсертер.]
Заголовок:
#include <boost/mpl/transform.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence, Seq1, Seq2 |
Прямая последовательность |
Последовательности для преобразования. |
Op, BinaryOp |
Лямбда-выражение |
Преобразование. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любых прямых последовательностей s, s1 и s2, лямбда выражения op и op2, инсертера in:
typedef transform<s,op,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<op>::type f;
typedef lambda<in::operation>::type in_op;
typedef fold<
s,
in::state,
bind<
in_op,
_1,
bind<f, _2>
>
>::type r;
2:
typedef transform<s1,s2,op,in>::type r;
Возвращаемый тип: тип.
Постусловие: эквивалентно
typedef lambda<op2>::type f;
typedef lambda<in::operation>::type in_op;
typedef fold<
pair_view<s1,s2>,
in::state,
bind<
in_op,
_1,
bind<
f,
bind<first<>, _2>,
bind<second<>,_2>
>
>
>::type r;
Сложность:
Линейная. Колиество применений op/op2 пропорционально значениям размера
size<s>::value
size<s1>::value
Пример:
int main()
{
typedef mpl::vector<char,short,int,long,float,double> types;
typedef mpl::vector<char*,short*,int*,long*,float*,double*> pointers;
typedef mpl::transform<types,boost::add_pointer<mpl::_1>>::type result;
BOOST_MPL_ASSERT(( mpl::equal<result, pointers> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_transform, copy, replace_if
replace
Фомрат:
template
<
typename Sequence,
typename OldType,
typename NewType,
typename In = unspecified
>
struct replace
{
typedef unspecified type;
};
Описание:
Возвращает копию исходной последовательности, в который каждый тип OldType заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/replace.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
OldType |
Любой тип |
Тип, который заменяется новым типом. |
NewType |
Любой тип |
Тип, который меняет старый тип. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, инсертера in, произвольных типов x и y:
typedef replace<s,x,y,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef replace_if< s,y,is_same<_,x>,in >::type r;
Сложность:
Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<int,float,char,float,float,double> types;
typedef mpl::vector<int,double,char,double,double,double> expected;
typedef mpl::replace< types,float,double >::type result;
BOOST_MPL_ASSERT(( mpl::equal<result, expected > ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_replace, replace_if, remove, transform
replace_if
Фомрат:
template
<
typename Sequence,
typename Pred,
typename In = unspecified
>
struct replace_if
{
typedef unspecified type;
};
Описание:
Возвращает копию исходной последовательности, в который каждый тип, для которого предикат Pred возвращает правду, заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/replace_if.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Условие замены. |
NewType |
Любой тип |
Тип, который меняет старый тип. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертера in, произвольного типа x:
typedef replace_if<s,pred,x,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef transform< s, if_< apply_wrap1<p,_1>,x,_1>, in >::type r;
Сложность:
Линейная. Количество применений pred пропорционально значению размера
size<s>::value
количество вставок, не превышает значение размера.
Пример:
int main()
{
typedef mpl::vector_c<int,1,4,5,2,7,5,3,5> numbers;
typedef mpl::vector_c<int,1,4,0,2,0,0,3,0> expected;
typedef mpl::replace_if<
numbers,
mpl::greater<
mpl::_, // поочередно подставляются все элементы
mpl::int_<4> // если больше 4 == правда
>,
mpl::int_<0> // если greater == правда, меняет значение на 0
>::type result;
BOOST_MPL_ASSERT
((
mpl::equal<
result,
expected,
mpl::equal_to<mpl::_, mpl::_> // сравнивает каждый с каждым
>
));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_replace_if, replace, remove_if, transform
remove
Фомрат:
template
<
typename Sequence,
typename T,
typename In = unspecified
>
struct remove
{
typedef unspecified type;
};
Описание:
Возвращает новую последовательность, состоящую из всех элементов диапазона
[begin<Sequence>::type, end<Sequence>::type)
за исключением элементов, идентичных типу T.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/remove.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
T |
Любой тип |
Тип, который заменяется новым типом. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, инсертера in, произвольного типа x:
typedef remove<s,x,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef remove_if< s,is_same<_,x>,in >::type r;
Сложность:
Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<int,float,char,float,float,double>::type types;
typedef mpl::remove< types,float >::type result;
BOOST_MPL_ASSERT(( mpl::equal< result, mpl::vector<int,char,double>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_remove, remove_if, copy, replace
remove_if
Фомрат:
template
<
typename Sequence,
typename Pred,
typename In = unspecified
>
struct remove_if
{
typedef unspecified type;
};
Описание:
Возвращает новую последовательность, состоящую из всех элементов диапазона
[begin<Sequence>::type, end<Sequence>::type)
за исключением элементов, для которых предикат Pred возвращает правду.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/remove_if.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Условие замены. |
In |
Инсертер |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, инсертера in, унарного лямбда-выражения pred:
typedef remove_if<s,pred,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef lambda<in::operation>::type op;
typedef fold<
s,
in::state,
eval_if<
apply_wrap1<p,_2>,
identity<_1>,
apply_wrap2<op,_1,_2>
>
>::type r;
Сложность:
Линейная. Количество применений pred пропорционально значению размера
size<s>::value
количество вставок, не превышает значение размера.
Пример:
int main()
{
typedef mpl::vector_c<int,1,4,5,2,7,5,3,5>::type numbers;
typedef mpl::remove_if<
numbers,
mpl::greater<
mpl::_,
mpl::int_<4>
>
>::type result;
BOOST_MPL_ASSERT
((
mpl::equal<
result,
mpl::vector_c<int,1,4,2,3>,
mpl::equal_to<mpl::_,mpl::_>
>
));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_remove_if, remove, copy_if, replace_if
unique
Фомрат:
template
<
typename Seq,
typename Pred,
typename In = unspecified
>
struct unique
{
typedef unspecified type;
};
Описание:
Возвращает новую последовательность, в которой каждый тип элемента является уникальным, все дубликаты удалены.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/unique.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
Pred |
Бинарное лямбда-выражение |
Отношение эквивалентности. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, бинарного лямбда-выражения pred, инсертера in:
typedef unique<s,pred,in>::type r;
Возвращаемый тип: тип.
Семантика: если
size<s>::value <= 1
то, эквивалентно:
typedef copy<s,in>::type r;
иначе, эквивалентно:
typedef lambda<pred>::type p;
typedef lambda<in::operation>::type in_op;
typedef apply_wrap2<
in_op,
in::state,
front<types>::type
>::type in_state;
typedef fold<
s,
pair< in_state, front<s>::type >,
eval_if<
apply_wrap2<p, second<_1>, _2>,
identity< first<_1>
>,
apply_wrap2<in_op, first<_1>, _2>
>
>::type::first r;
Сложность:
Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера
size<s>::value - 1
Пример:
int main()
{
typedef mpl::vector<int,float,float,char,int,int,int,double> types;
typedef mpl::vector<int,float,char,int,double> expected;
typedef mpl::unique< types, boost::is_same<mpl::_1, mpl::_2> >::type result;
BOOST_MPL_ASSERT(( mpl::equal< result, expected > ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_unique, remove, copy_if, replace_if
partition
Фомрат:
template
<
typename Seq,
typename Pred,
typename In1 = unspecified,
typename In2 = unspecified
>
struct partition
{
typedef unspecified type;
};
Описание:
Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне
[begin<Seq>::type, end<Seq>::type)
разделенные на две группы, в соответствии с предикатом Pred. partition – синоним stable_partition.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/partition.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Seq |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Предикат разделения. |
In1, In2 |
Инсертер (механизм вставки) |
Инсертеры вывода. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:
typedef partition<s,pred,in1,in2>::type r;
Возвращаемый тип: пара.
Семантика: эквивалентно
typedef stable_partition<s,pred,in1,in2>::type r;
Сложность:
Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера
size<s>::value
Пример:
template< typename N >
struct is_odd
: mpl::bool_<(N::value % 2)>
{};
int main()
{
typedef mpl::partition<
mpl::range_c<int,0,10>,
is_odd<mpl::_1>,
mpl::back_inserter< mpl::vector<> >,
mpl::back_inserter< mpl::vector<> >
>::type r;
BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int,1,3,5,7,9>> ));
BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int,0,2,4,6,8>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_partition, stable_partition, sort
stable_partition
Фомрат:
template
<
typename Seq,
typename Pred,
typename In1 = unspecified,
typename In2 = unspecified
>
struct stable_partition
{
typedef unspecified type;
};
Описание:
Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне
[begin<Seq>::type, end<Seq>::type)
разделенные на две группы, в соответствии с предикатом Pred. stable_partition гарантирует сохранение относительной упорядоченности в результирующей последовательности.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/stable_partition.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Seq |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Предикат разделения. |
In1, In2 |
Инсертер (механизм вставки) |
Инсертеры вывода. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:
typedef stable_partition<s,pred,in1,in2>::type r;
Возвращаемый тип: пара.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef lambda<in1::operation>::type in1_op;
typedef lambda<in2::operation>::type in2_op;
typedef fold<
s,
pair< in1::state, in2::state >,
if_<
apply_wrap1<p,_2>,
pair<
apply_wrap2<
in1_op,
first<_1>,
_2>,
second<_1>
>,
pair<
first<_1>,
apply_wrap2<
in2_op,
second<_1>,
_2
>
>
>
>::type r;
Сложность:
Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера
size<s>::value
Пример:
template< typename N >
struct is_odd
: mpl::bool_<(N::value % 2)>
{};
int main()
{
typedef mpl::stable_partition<
mpl::range_c<int,0,10>,
is_odd<mpl::_1>,
mpl::back_inserter< mpl::vector<> >,
mpl::back_inserter< mpl::vector<> >
>::type r;
BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int,1,3,5,7,9> > ));
BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int,0,2,4,6,8> > ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_stable_partition, partition, sort, transform
sort
Фомрат:
template
<
typename Seq,
typename Pred = less<_1,_2>,
typename In = unspecified
>
struct sort
{
typedef unspecified type;
};
Описание:
Возвращает новую последовательность всех элементы в диапазоне
[begin<Seq>::type, end<Seq>::type)
отсортированных в соответствии с предикатом отношения упорядочения Pred.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/sort.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Seq |
Прямая последовательность |
Исходная последовательность. |
Pred |
Бинарное лямбда-выражение |
Предикат разделения. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, бинарного лямбда-выражения pred, инсертера in:
typedef sort<s,pred,in>::type r;
Возвращаемый тип: тип.
Семантика: если
size<s>::value <= 1
то, эквивалентно:
typedef copy<s,in>::type r;
иначе, эквивалентно:
typedef back_inserter< vector<> > aux_in;
typedef lambda<pred>::type p;
typedef begin<s>::type pivot;
typedef partition<
iterator_range<
next<pivot>::type,
end<s>::type
>,
apply_wrap2<p,_1,deref<pivot>::type>,
aux_in,
aux_in
>::type partitioned;
typedef sort<partitioned::first,p,aux_in >::type part1;
typedef sort<partitioned::second,p,aux_in >::type part2;
typedef copy<
joint_view<
joint_view<
part1,
single_view< deref<pivot>::type >
>,
part2
>,
in
>::type r;
Сложность:
В среденем O(n log(n)), если
n == size<s>::value
в худшем случае – квадратичное.
Пример:
int main()
{
typedef mpl::vector_c<int,3,4,0,-5,8,-1,7> numbers;
typedef mpl::vector_c<int,-5,-1,0,3,4,7,8> expected;
typedef mpl::sort<numbers>::type result;
BOOST_MPL_ASSERT
((
mpl::equal<
result,
expected,
mpl::equal_to<mpl::_,mpl::_>
>
));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, partition
reverse
Фомрат:
template
<
typename Sequence,
typename In = unspecified
>
struct reverse
{
typedef unspecified type;
};
Описание:
Возвращает реверсную копию исходной последовательности. reverse –синоним reverse_copy.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/reverse.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для разворота. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Для любой прямой последовательности s, инсертера in:
typedef reverse<s,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef reverse_copy<s,in>::type r;
Сложность: линейная.
Пример:
int main()
{
typedef mpl::vector_c<int,9,8,7,6,5,4,3,2,1,0> numbers;
typedef mpl::reverse< numbers >::type result;
BOOST_MPL_ASSERT(( mpl::equal< result, mpl::range_c<int,0,10> > ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_copy, copy, copy_if
reverse_copy
Фомрат:
template
<
typename Sequence,
typename In = unspecified
>
struct reverse_copy
{
typedef unspecified type;
};
Описание:
Возвращает реверсную копию исходной последовательности. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/copy.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для копирования. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s и инсертера in:
typedef reverse_copy<s,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef reverse_fold< s,in::state,in::operation >::type r;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::list_c<int,10,11,12,13,14,15,16,17,18,19>::type numbers;
typedef mpl::reverse_copy<
mpl::range_c<int,0,10>,
mpl::front_inserter< numbers >
>::type result;
BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 20 );
BOOST_MPL_ASSERT(( mpl::equal< result, mpl::range_c<int,0,20>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, copy, reverse_copy_if, reverse_transform
reverse_copy_if
Фомрат:
template
<
typename Sequence,
typename Pred,
typename In = unspecified
>
struct reverse_copy_if
{
typedef unspecified type;
};
Описание:
Возвращает реверсную проверенную копию исходной последовательности. Копия содержит элементы, для которых предикат Pred вернул правду. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/copy_if.hpp>
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Последовательность для копирования. |
Pred |
Унарное лямбда-выражение |
Условие копирования. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred и инсертера in:
typedef reverse_copy_if<s,pred,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef lambda<in::operation>::type op;
typedef reverse_fold<
s,
in::state,
eval_if<
apply_wrap1<p, _2>,
apply_wrap2<op, _1, _2>,
identity<_1>
>
>::type r;
Сложность:
Линейная. Время работы прямо пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::reverse_copy_if<
mpl::range_c<int,0,10>,
mpl::less<
mpl::_1,
mpl::int_<5>
>,
mpl::front_inserter< mpl::vector<> >
>::type result;
BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 5 );
BOOST_MPL_ASSERT(( mpl::equal<result, mpl::range_c<int,0, 5>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, copy_if, reverse_copy, remove_if, replace_if
reverse_transform
Фомрат:
template
<
typename Seq,
typename Op,
typename In = unspecified
>
struct reverse_transform
{
typedef unspecified type;
};
template
<
typename Seq1,
typename Seq2,
typename BinaryOp,
typename In = unspecified
>
struct reverse_transform
{
typedef unspecified type;
};
Описание:
Алгоритм reverse_transform имеет несколько перегруженных версий:
reverse_transform<Seq,Op>: возвращает преобразованную реверсную копию исходной последовательности, полученную посредством применения унарного преобразования Op к каждому элементу в диапазоне
[begin<Sequence>::type, end<Sequence>::type)
reverse_transform<Seq1,Seq2,Op>: возвращает новую последовательность в реверсном порядке, полученную путем применения бинарного преобразования BinaryOp для пары элементов (e1, e21) из соответствующих диапазонов
[begin<Seq1>::type, end<Seq1>::type)
и
[begin<Seq2>::type, end<Seq2>::type)
[Эта формулировка относится к алгоритмам, не использующим инсертер.]
Заголовок:
#include <boost/mpl/transform.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence, Seq1, Seq2 |
Прямая последовательность |
Последовательности для преобразования. |
Op, BinaryOp |
Лямбда-выражение |
Преобразование. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любых прямых последовательностей s, s1 и s2, лямбда выражения op и op2, инсертера in:
typedef transform<s,op,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<op>::type f;
typedef lambda<in::operation>::type in_op;
typedef reverse_fold<
s,
in::state,
bind<
in_op,
_1,
bind<f, _2>
>
>::type r;
2:
typedef transform<s1,s2,op,in>::type r;
Возвращаемый тип: тип.
Постусловие: эквивалентно
typedef lambda<op2>::type f;
typedef lambda<in::operation>::type in_op;
typedef reverse_fold<
pair_view<s1,s2>,
in::state,
bind<
in_op,
_1,
bind<
f,
bind<first<>, _2>,
bind<second<>,_2>
>
>
>::type r;
Сложность:
Линейная. Колиество применений op/op2 пропорционально значениям размера
size<s>::value
size<s1>::value
Пример:
int main()
{
typedef mpl::vector<char,short,int,long,float,double> types;
typedef mpl::vector<double*,float*,long*,int*,short*,char*> pointers;
typedef mpl::reverse_transform<types, boost::add_pointer<_1> >::type result;
BOOST_MPL_ASSERT(( mpl::equal<result, pointers> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_transform, copy, replace_if
reverse_replace
Фомрат:
template
<
typename Sequence,
typename OldType,
typename NewType,
typename In = unspecified
>
struct reverse_replace
{
typedef unspecified type;
};
Описание:
Возвращает реверсную копию исходной последовательности, в который каждый тип OldType заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/replace.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
OldType |
Любой тип |
Тип, который заменяется новым типом. |
NewType |
Любой тип |
Тип, который меняет старый тип. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, инсертера in, произвольных типов x и y:
typedef reverse_replace<s,x,y,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef reverse_replace_if< s,y,is_same<_,x>,in >::type r;
Сложность:
Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<int,float,char,float,float,double> types;
typedef mpl::vector<double,double,double,char,double,int> expected;
typedef mpl::reverse_replace< types,float,double >::type result;
BOOST_MPL_ASSERT(( mpl::equal< result, expected > ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_replace, replace_if, remove, transform
reverse_replace_if
Фомрат:
template
<
typename Sequence,
typename Pred,
typename In = unspecified
>
struct reverse_replace_if
{
typedef unspecified type;
};
Описание:
Возвращает реверсную копию исходной последовательности, в который каждый тип, для которого предикат Pred возвращает правду, заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/replace_if.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Условие замены. |
NewType |
Любой тип |
Тип, который меняет старый тип. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертера in, произвольного типа x:
typedef reverse_replace_if<s,pred,x,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef reverse_transform< s, if_< apply_wrap1<p,_1>,x,_1>, in >::type r;
Сложность:
Линейная. Количество применений pred пропорционально значению размера
size<s>::value
количество вставок, не превышает значение размера.
Пример:
int main()
{
typedef mpl::vector_c<int,1,4,5,2,7,5,3,5> numbers;
typedef mpl::vector_c<int,1,4,0,2,0,0,3,0> expected;
typedef mpl:: reverse_replace_if<
numbers,
mpl::greater<
mpl::_, // поочередно подставляются все элементы
mpl::int_<4> // если больше 4 == правда
>,
mpl::int_<0>, // если greater == правда, меняет значение на 0
mpl::front_inserter< mpl::vector<> >
>::type result;
BOOST_MPL_ASSERT
((
mpl::equal<
result,
expected,
mpl::equal_to<mpl::_, mpl::_> // сравнивает каждый с каждым
>
));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_replace_if, replace, remove_if, transform
reverse_remove
Фомрат:
template
<
typename Sequence,
typename T,
typename In = unspecified
>
struct reverse_remove
{
typedef unspecified type;
};
Описание:
Возвращает новую последовательность, состоящую из всех элементов диапазона
[begin<Sequence>::type, end<Sequence>::type)
за исключением элементов, идентичных типу T в реверсном порядке.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/remove.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
T |
Любой тип |
Тип, который заменяется новым типом. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, инсертера in, произвольного типа x:
typedef reverse_remove<s,x,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef reverse_remove_if< s,is_same<_,x>,in >::type r;
Сложность:
Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера
size<s>::value
Пример:
int main()
{
typedef mpl::vector<int,float,char,float,float,double>::type types;
typedef mpl:: reverse_remove< types,float >::type result;
BOOST_MPL_ASSERT(( mpl::equal< result, mpl::vector< double,char,int>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_remove, remove_if, copy, replace
reverse_remove_if
Фомрат:
template
<
typename Sequence,
typename Pred,
typename In = unspecified
>
struct reverse_remove_if
{
typedef unspecified type;
};
Описание:
Возвращает новую последовательность в реверсном порядке, состоящую из всех элементов диапазона
[begin<Sequence>::type, end<Sequence>::type)
за исключением элементов, для которых предикат Pred возвращает правду.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/remove_if.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Условие замены. |
In |
Инсертер |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, инсертера in, унарного лямбда-выражения pred:
typedef reverse_remove_if<s,pred,in>::type r;
Возвращаемый тип: тип.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef lambda<in::operation>::type op;
typedef reverse_fold<
s,
in::state,
eval_if<
apply_wrap1<p,_2>,
identity<_1>,
apply_wrap2<op,_1,_2>
>
>::type r;
Сложность:
Линейная. Количество применений pred пропорционально значению размера
size<s>::value
количество вставок, не превышает значение размера.
Пример:
int main()
{
typedef mpl::vector_c<int,1,4,5,2,7,5,3,5>::type numbers;
typedef mpl:: reverse_remove_if<
numbers,
mpl::greater<
mpl::_,
mpl::int_<4>
>
>::type result;
BOOST_MPL_ASSERT
((
mpl::equal<
result,
mpl::vector_c<int, 3,2,4,1>,
mpl::equal_to<mpl::_,mpl::_>
>
));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_remove_if, remove, copy_if, replace_if
reverse_unique
Фомрат:
template
<
typename Seq,
typename Pred,
typename In = unspecified
>
struct reverse_unique
{
typedef unspecified type;
};
Описание:
Возвращает новую последовательность в реверсном порядке, в которой каждый тип элемента является уникальным, все дубликаты удалены.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/unique.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Sequence |
Прямая последовательность |
Исходная последовательность. |
Pred |
Бинарное лямбда-выражение |
Отношение эквивалентности. |
In |
Инсертер (механизм вставки) |
Инсертер. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, бинарного лямбда-выражения pred, инсертера in:
typedef reverse_unique<s,pred,in>::type r;
Возвращаемый тип: тип.
Семантика: если
size<s>::value <= 1
то, эквивалентно:
typedef reverse_copy<s,in>::type r;
иначе, эквивалентно:
typedef lambda<pred>::type p;
typedef lambda<in::operation>::type in_op;
typedef apply_wrap2<
in_op,
in::state,
front<types>::type
>::type in_state;
typedef reverse_fold<
s,
pair< in_state, front<s>::type >,
eval_if<
apply_wrap2<p, second<_1>, _2>,
identity< first<_1>
>,
apply_wrap2<in_op, first<_1>, _2>
>
>::type::first r;
Сложность:
Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера
size<s>::value - 1
Пример:
int main()
{
typedef mpl::vector<int,float,float,char,int,int,int,double> types;
typedef mpl::vector< double,int,char,float,int> expected;
typedef mpl:: reverse_unique< types, boost::is_same<mpl::_1, mpl::_2> >::type result;
BOOST_MPL_ASSERT(( mpl::equal< result, expected > ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_unique, remove, copy_if, replace_if
reverse_partition
Фомрат:
template
<
typename Seq,
typename Pred,
typename In1 = unspecified,
typename In2 = unspecified
>
struct reverse_partition
{
typedef unspecified type;
};
Описание:
Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне
[begin<Seq>::type, end<Seq>::type)
разделенные на две группы, в соответствии с предикатом Pred. reverse_partition – синоним reverse_stable_partition.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/partition.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Seq |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Предикат разделения. |
In1, In2 |
Инсертер (механизм вставки) |
Инсертеры вывода. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:
typedef reverse_partition<s,pred,in1,in2>::type r;
Возвращаемый тип: пара.
Семантика: эквивалентно
typedef reverse_stable_partition<s,pred,in1,in2>::type r;
Сложность:
Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера
size<s>::value
Пример:
template< typename N >
struct is_odd
: mpl::bool_<(N::value % 2)>
{};
int main()
{
typedef mpl::reverse_partition<
mpl::range_c<int,0,10>,
is_odd<mpl::_1>,
mpl::back_inserter< mpl::vector<> >,
mpl::back_inserter< mpl::vector<> >
>::type r;
BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int,9,7,5,3,1>> ));
BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int,8,6,4,2,0>> ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_partition, stable_partition, sort
reverse_stable_partition
Фомрат:
template
<
typename Seq,
typename Pred,
typename In1 = unspecified,
typename In2 = unspecified
>
struct reverse_stable_partition
{
typedef unspecified type;
};
Описание:
Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне
[begin<Seq>::type, end<Seq>::type)
разделенные на две группы, в соответствии с предикатом Pred. stable_partition гарантирует сохранение реверсной относительной упорядоченности в результирующей последовательности.
[Эта формулировка относится к вариантам алгоритма без использования инсертера.]
Заголовок:
#include <boost/mpl/stable_partition.hpp>
Модель:
Реверсный алгоритм.
Параметры:
Выражение |
Требование |
Описание |
Seq |
Прямая последовательность |
Исходная последовательность. |
Pred |
Унарное лямбда-выражение |
Предикат разделения. |
In1, In2 |
Инсертер (механизм вставки) |
Инсертеры вывода. |
Семантика выражений:
Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.
Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:
typedef reverse_stable_partition<s,pred,in1,in2>::type r;
Возвращаемый тип: пара.
Семантика: эквивалентно
typedef lambda<pred>::type p;
typedef lambda<in1::operation>::type in1_op;
typedef lambda<in2::operation>::type in2_op;
typedef reverse_fold<
s,
pair< in1::state, in2::state >,
if_<
apply_wrap1<p,_2>,
pair<
apply_wrap2<
in1_op,
first<_1>,
_2>,
second<_1>
>,
pair<
first<_1>,
apply_wrap2<
in2_op,
second<_1>,
_2
>
>
>
>::type r;
Сложность:
Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера
size<s>::value
Пример:
template< typename N >
struct is_odd
: mpl::bool_<(N::value % 2)>
{};
int main()
{
typedef mpl:: reverse_stable_partition<
mpl::range_c<int,0,10>,
is_odd<mpl::_1>,
mpl::back_inserter< mpl::vector<> >,
mpl::back_inserter< mpl::vector<> >
>::type r;
BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int, 9,7,5,3,1> > ));
BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int, 8,6,4,2,0> > ));
return 0;
}
Смотри также:
Transformation Algorithms, Reversible Algorithm, reverse_stable_partition, partition, sort, transform
