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

Метафункции

advance

Фомрат:

template

<

typename Iterator,

typename N

>

struct advance

{

typedef unspecified type;

};

Описание:

Смещает итератор Iterator на расстояние N. Возвращает тип n-го элемента от начала последовательности. Для двунаправленного итератора и итератора произвольного доступа поддерживается смещение в обратную сторону.

Заголовок:

#include <boost/mpl/advance.hpp>

Параметры:

Выражение

Требование

Описание

Iterator

Прямой итератор

Итератор для смещения

N

Интегральная константа

Расстояние

Модель:

  • Tag Dispatched Metafunction

Семантика выражений:

Для любого прямого итератора iter и произвольной интегральной константы n:

typedef advance<iter,n>::type j;

Возвращаемый тип: прямой итератор.

Предусловие: если итератор является прямым, то значение n::value должно быть неотрицательным.

0 <= n < size<Sequence>::value

Семантика: допустимо

typedef iter i0;

typedef next<i0>::type i1;

...

typedef next<in-1>::type j;

если значение n::value > 0, то допустимо

typedef iter i0;

typedef prior<i0>::type i1;

...

typedef prior<in-1 >::type j;

Постусловия: j – итератор: разыменованный или следующий за последним элементом. Если n::value > 0, то справедливо:

distance<iter,j>::value == n::value

в противном случае:

distance<j,iter>::value == n::value

Сложность:

Амортизированное постоянное время если iter является моделью итератора с произвольным доступом, в противном случае – линейное время.

Пример:

int main()

{

typedef mpl::range_c<int,0,10> numbers;

typedef mpl::begin<numbers>::type first;

typedef mpl::end<numbers>::type last;

typedef mpl::advance<first, mpl::int_<10> >::type i1;

typedef mpl::advance<last, mpl::int_<-10> >::type i2;

BOOST_MPL_ASSERT(( boost::is_same<i1,last> ));

BOOST_MPL_ASSERT(( boost::is_same<i2,first> ));

return 0;

};

Смотри также:

Iterators, Tag Dispatched Metafunction, distance, next

distance

Фомрат:

template

<

typename First,

typename Last

>

struct distance

{

typedef unspecified type;

};

Описание:

Возвращает интегральную константу n – значение расстояния между итераторами First и Last, для которй следующее выражение идентично итеоратору Last:

advance<First,n>::type

Заголовок:

#include <boost/mpl/distance.hpp>

Параметры:

Выражение

Требование

Описание

First/Last

Прямой итератор

Итераторы для вычисления расстояния между собой.

N

Интегральная константа

Расстояние

Модель:

  • Tag Dispatched Metafunction

Семантика выражений:

Для любых прямых итераторов First и Last:

typedef distance<first,last>::type n;

Возвращаемый тип: интегральная константа.

Предусловие: [first, last) – действительный диапазон.

Семантика: эквивалентно

typedef iter_fold<

iterator_range<first,last>,

long_<0>,

next<_1>

>::type n;

Постусловия:

is_same< advance<first,n>::type, last >::value == true.

Сложность:

Амортизированное постоянное время если итераторы First и Last являются итераторами с произвольным доступом, в противном случае – линейное время.

Пример:

int main()

{

typedef mpl::range_c<int,0,10>::type range;

typedef mpl::begin<range>::type first;

typedef mpl::end<range>::type last;

BOOST_MPL_ASSERT_RELATION(( mpl::distance<first,last>::value), ==, 10);

return 0;

};

Смотри также:

Iterators, Tag Dispatched Metafunction, advance, next, prior

next

Фомрат:

template<typename Iterator>

struct next

{

typedef unspecified type;

};

Описание:

Возвращает следующий итератор в последовательности. Для next есть несколько перегруженных версий. Например, если X является интегральной константой, то next<X> возвращает инкрементированное значение данной константы такого же типа.

Заголовок:

#include <boost/mpl/next_prior.hpp>

Параметры:

Выражение

Требование

Описание

Iterator

Прямой итератор

Итератор для инкрементации.

Семантика выражений:

Для любого прямого итератора iter:

typedef next<iter>::type j;

Возвращаемый тип: прямой итератор.

Предусловие: iter поддерживает инкрементацию.

Семантика: j – итератор: разыменованный или следующий за последним элементом. Если iter является итератором, определенный пользователем, то библиотека поддерживает реализацию по умолчанию, эквивалентную

typedef iter::next j;

Сложность:

Амортизированное постоянное время.

Пример:

int main()

{

typedef mpl::vector_c<int,1> v;

typedef mpl::begin<v>::type first;

typedef mpl::end<v>::type last;

BOOST_MPL_ASSERT(( boost::is_same< mpl::next<first>::type, last > ));

return 0;

};

Смотри также:

Iterators, begin / end, prior, deref

prior

Фомрат:

template<typename Iterator>

struct prior

{

typedef unspecified type;

};

Описание:

Возвращает предыдущий итератор в последовательности. Для prior есть несколько перегруженных версий. Например, если X является интегральной константой, то prior<X> возвращает декрементированное значение данной константы такого же типа.

Заголовок:

#include <boost/mpl/next_prior.hpp>

Параметры:

Выражение

Требование

Описание

Iterator

Прямой итератор

Итератор для декрементации.

Семантика выражений:

Для любого прямого итератора iter:

typedef prior<iter>::type j;

Возвращаемый тип: прямой итератор.

Предусловие: iter поддерживает декрементацию.

Семантика: j – итератор, указывающий на предыдущий элемент в последовательности. Если iter является итератором, определенный пользователем, то библиотека поддерживает реализацию по умолчанию, эквивалентную

typedef iter::prior j;

Сложность:

Амортизированное постоянное время.

Пример:

int main()

{

typedef mpl::vector_c<int,1> v;

typedef mpl::end<v>::type first;

typedef mpl::begin<v>::type last;

BOOST_MPL_ASSERT(( boost::is_same< mpl::prior<first>::type, last > ));

return 0;

};

Смотри также:

Iterators, begin / end, next, deref

deref

Фомрат:

template<typename Iterator>

struct deref

{

typedef unspecified type;

};

Описание:

Разыменование итератора.

Заголовок:

#include <boost/mpl/deref.hpp>

Параметры:

Выражение

Требование

Описание

Iterator

Прямой итератор

Итератор для разыменования.

Семантика выражений:

Для любого прямого итератора iter:

typedef deref<iter>::type t;

Возвращаемый тип: тип.

Предусловие: iter поддерживает разыменование.

Семантика: t – идентичен элементу, на который ссылается итератор iter. Если iter является итератором, определенный пользователем, то библиотека поддерживает реализацию по умолчанию, эквивалентную

typedef iter::type t;

Сложность:

Амортизированное постоянное время.

Пример:

int main()

{

typedef mpl::vector<char,short,int,long> types;

typedef mpl::begin<types>::type iter;

BOOST_MPL_ASSERT(( boost::is_same< mpl::deref<iter>::type, char > ));

return 0;

};

Смотри также:

Iterators, begin / end, next

iterator_category

Фомрат:

template<typename Iterator>

struct iterator_category

{

typedef typename Iterator::category type;

};

Описание:

Возвращает один из следующих тэков категории итератора:

  • forward_iterator_tag

  • bidirectional_iterator_tag

  • random_access_iterator_tag

Заголовок:

#include <boost/mpl/iterator_category.hpp>

#include <boost/mpl/iterator_tags.hpp>

Параметры:

Выражение

Требование

Описание

Iterator

Прямой итератор

Итератор для получения категории.

Семантика выражений:

Для любого прямого итератора iter:

typedef iterator_category<iter>::type tag;

Возвращаемый тип: интегральная константа.

Семантика:

tag - forward_iterator_tag если iter является моделью прямого итератора;

tag - bidirectional_iterator_tag если iter является моделью двунаправленного итератора;

tag - random_access_iterator_tag если iter является моделью итератора произвольного доступа;

Постусловие:

forward_iterator_tag::value < bidirectional_iterator_tag::value,

bidirectional_iterator_tag::value < random_access_iterator_tag::value.

Сложность:

Амортизированное постоянное время.

Пример:

template< typename Tag, typename Iterator >

struct algorithm_impl

{

// O(n) implementation

};

template< typename Iterator >

struct algorithm_impl<random_access_iterator_tag, Iterator>

{

// O(1) implementation

};

template< typename Iterator >

struct algorithm

: algorithm_impl<iterator_category<Iterator>::type, Iterator>

{};

Смотри также:

Iterators, begin / end, advance, distance, next

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