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

Добавление расширения

Добавим операции, необходимые для расширения последовательности. Мы не покажет вам все из них, потому что они настолько похожи по духу. Кроме того, нам нужно оставить что-то для упражнения в конце главы!

Реализация сlear/push_font: добавление элементов в начало посредством push_front – требует особого подхода, т.к. размер последовательности ограничен. Т.о., допустимым может быть вставка только в том случае, если есть хоть 1 свободный (none) элемент в списке, в этом случае крайний будет вытолкан, а в начла подставлен новый.

namespace boost {

namespace mpl {

template <>

struct clear_impl<tiny_tag>

{

template <class Tiny>

struct apply : tiny<>

{};

};

template <>

struct push_front_impl<tiny_tag>

{

template <class Tiny, class T>

struct apply

: tiny<T, typename Tiny::t0, typename Tiny::t1>

{};

};

}

}

Благодаря тому, что каждая последовательность возвращает тип самой себя, удалось воспользоваться механизмом метафункционального продвижения (пересылки) посредством наследования – этот подход необходимо использовать для поддержки максимально совместимости с библиотекой MPL.

Реализация push_back: воспользуемся уже написанной специализацией для определения длины, которая использовалась для mpl::end. Теперь необходимо добавить шаблонную специализацию tiny_push_back для последовательности каждой конкретной длины:

template <class Tiny, class T, int N>

struct tiny_push_back;

template <class Tiny, class T>

struct tiny_push_back<Tiny,T,0>

: tiny<T,none,none>

{};

template <class Tiny, class T>

struct tiny_push_back<Tiny,T,1>

: tiny<typename Tiny::t0,T,none>

{};

template <class Tiny, class T>

struct tiny_push_back<Tiny,T,2>

: tiny<typename Tiny::t0,typename Tiny::t1,T>

{};

namespace boost {

namespace mpl {

template <>

struct push_back_impl<tiny_tag>

{

template <class Tiny, class T>

struct apply

: tiny_push_back<

Tiny, T, size<Tiny>::value

>

{};

};

}

}

Реализовав отдельно tiny_push_back и продвинув его содержимое в реализации push_back_impl удалось наделить стандартную реализацию необходимым функционалом для типа нашей последовательности (выбор посредством тэга). Увеличивая размер последовательности, необходимо добавлять и новые специализации, иначе будет ошибка компиляции, т.к. не будет найдена специализаци с конкретным числом.

Алгоритмы

Качество алгоритмов – качество программы.

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

Абстракция:

Абстракция - обобщение частных случаев некоторым общим понятием,

«сущность» объекта или процесса. Некоторые абстракции, такие как итератор STL, стали настолько привычным, что их можно назвать идиоматическими. В разработке программного обеспечения, идея повторного использования кода наилучшим образом достигается за счет подобных идиоматических абстракций. Лучшие библиотеки обеспечивают повторное использование кода и самих идиом.

Алгоритмы MPL являются более абстрагированными, чем одноименные алгоритмы STL, т.к. работаю на этапе компиляции и манипулируют типами, а не значениями контейнеров.

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