Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
template_metaprogramming_ru.docx
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
774 Кб
Скачать
☆

Представления

(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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]