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

Интегральные последовательности

MPL предоставялет следующие обертки дляинтегральных последовательностей: vector_c, list_c, deque_c, и set_c.

Формат:

sequence-type_c<T, n1, n2, ... nk>

Первый аргумент каждой из этих оберток – интегральный тип T, который это сохранит, и следующие аргументы – знаяения типа T.

Цель такого формата упростить следующую запись:

sequence-type<

integral_c<T,n1>

, integral_c<T,n2>

, ...

, integral_c<T,nk>

>

Это лишь демонстрация упрощения, а не полная эквивалентность записи. MPL также обеспечивает суффикс «_c» (от const) для пронумерованных последовательностей:

#include <boost/mpl/vector/vector10_c.hpp>

typedef boost::mpl::vector10_c<int,1,2,3,4,5,6,7,8,9,10> v10;

Последовательности

Если STL – это взаимосвязь обобщенных структур данных и алгоритмов, то MPL основан на алгоритмах времени компиляции, метафункциях, последовательностях и итераторах.

Контейнеры STL не являются фундаментом ее интерфейсов, в то время как в MPL последовательности напрямую связаны с работой алгоритмов.

Связующее звено работы алгоритмов и последовательностей – итераторы.

Концепции

Концепция – описание требований, налагаемых обобщенными компонентыми, которые необходимо соблюдать для их использования, например вид допустимых аргументов. Примером концепций может быть метафункция apply_helper, которая требовала, чтобы ее первым аргументом был класс метафункции.

Тип или группа типов, которая удовлетворяет требованиям концепции, моделируют ее или являются моделью понятия. Таким образом, plus_f, является моделью класса метафункции. Концепция, котороая устаналвиает требования для других концепция является надмножеством своих концепций.

Требования концепций обычно основаны на следующих категориях:

Действительность выражения

C++ выражения, которые должны быть успешно скомпилированными объектами, участвующими в выражении модели концепции. Например, от Iterator x, ожидается поддержка выражения оператора «++» и «*».

Ассоциация типов

Типы, которые участвуют в одном или больше действительном выражении и могут быть вычислены типом(ми), моделируемыми концепцией. Как правило, к ассоциированным типам можно получить доступ посредством typedef, т.к. они вложенны в определениях класса для моделированного типа или посредством класс свойств.

Инварианты

Характеристики времени выполнения инстанцируемой модели, которые должны всегда быть true. Инварианты часто имеют форму пред- и пост- условий (pre-/post- conditions). Например, после того, как Iterator будет скопирован, копия и оригинал должны быть эквивалентными.

Гарантии сложности

Гарантии того, сколько времени будет требоваться на выполнение того или иного выражения или сколько различных ресурсов будет использовать данное вычисление. Увеличивание итератора, например, обязано иметь постоянную сложность.

Итераторы

Итераторы STL и MPL не могут быть идентичными в силу природы работы с метаданными. Так, на этапе компиляции не может быть итераторов ввода и вывода.

Сложность работы итераторов времени выполнения STL постоянна - O(1), все фундаментальные итераторв MPL имеют также постоянную сложность O(1) хоть и работают во время компиляции.

Сложность операции времени компиляции может быть измерена количеством требуемых инстанцирований шаблона. Есть и другие факторы, которые определят время, требуемое для создания программы.

Каждая последующая концпеция итератора уточняет и поддерживает предыдущую, так все двунаправленные итераторы являются также и прямыми итераторами, а все итераторы произвольного доступа, явялются двунаправленными и прямыми.

Прямые

Прямой итератор - самый простой MPL итератор, который содержит лишь три операции:

  • Прямое перемещение;

  • Доступ к элементу;

  • Выявление категории.

MPL итератор может или быть и инкрементирован/декрементирован, или быть последним итератором последовательности. Эти два состояния для итераторов являются взаимоисключающими, т.е. изменения итератора недопустимы если он является последним.

Неизменные итераторы не могут изменяться в MPL, их нельзя увеличить способами STL, вместо этого, отни могут выступть аргументами функции смещения mpl::next, результат которой будет итератор следующего элемента последовательности. Автор функции инкрементации итератора может специализировать mpl::next для поддержки типа его итератора, или использовать реализацию по умолчанию для получения доступа к следующему элементу последовательности:

namespace boost {

namespace mpl {

template <class It> struct next

{

typedef typename It::next type;

};

}

}

Реализация по умолчанию метафункции раскрытия итератора эквивалента обращению к вложенному элементу «::type»:

namespace boost {

namespace mpl {

template <class It> struct deref

{

typedef typename It::type type;

};

}

}

Чтобы проверить итераторы на предмет равенства, используйте boost::is_same из библиотеки Boost Type Traits. Два итератора эквивалентны, только если они одного типа. Метафункция is_same также используется для сравнения итретаора с последним. Итератор j, достижим из итератора i только если они эквивалентны или ведут работу с одной последовательностью:

typedef mpl::next<i>::type i1;

typedef mpl::next<i1>::type i2;

.

.

.

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

Будем использовать нотацию «полуоткрытых диапазонов» [i, j), что обозначает диапазон элементов последовательности, начинающихся с mpl::deref<i>::type включительно и заканчивается mpl::deref <in-1>::type.

Требования MPL для прямых итераторов, где i - модель прямого итератора.

Expression

Result

Precondition

mpl::next<i>::type

A Forward Iterator.

i is incrementable.

mpl::deref<i>::type

Any type.

i is dereferenceable.

i::category

Convertible to mpl:: forward_iterator_tag.

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