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

Mpl алгоритмы

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

Различия stl и mpl алгоритмов:

  • Обработка метаданных, которые являются константами требует от алгоритмов MPL возвращать новые последовательности, т.к. изменить оригинальные нет возможности.

  • MPL алгоритмы работают напрямую с элементами последовательностями, а не посредством диапазонов итераторов. Эта работа более высокого уровня абстракции со всеми нюансами шаблонного метапрограммирования.

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

Пример:

Обход последовательности с заменой всех типов float на тип double, определением наибольшего типа и его разыменованием:

template <class Seq>

struct biggest_float_as_double

: mpl::deref< // >----------+

typename mpl::max_element< // >-------+ |

typename mpl::replace< // >----+ | |

Seq, // | | |

float, // | | |

double // | | |

>::type, // 1<---+ | |

mpl::less< // | |

mpl::sizeof_<_1>, // | |

mpl::sizeof_<_2>> // | |

>::type // 2<------+ |

> // 3<---------+

{};

// 1.Меняем в последовательности все float на double.

// 2.Находим наибоьший тип в последовательности.

// 3.Раскрываем наибольший тип.

Если вместо последовательности в алгоритмы max_element и replace передавать итераторы, то код biggest_float_as_double, выглядел бы следующим образом:

template <class Seq>

struct biggest_float_as_double

{

typedef typename mpl::replace<

typename mpl::begin<Seq>::type,

typename mpl::end<Seq>::type,

float, double

>::type replaced;

typedef typename mpl::max_element<

typename mpl::begin<replaced>::type,

typename mpl::end<replaced>::type,

mpl::less<mpl::sizeof_<_1>, mpl::sizeof_<_2>>

>::type max_pos;

typedef typename mpl::deref<max_pos>::type type;

};

Вставки

(Inserters)

Другое важное различие между алгоритмами MPL и STL проистекает из функциональной природы шаблонного метапрограммирования. Семейство алгоритмов STL по созданию последовательностей, таких как: copy, transform и replace_copy_if, все принимают итератор для вывода, в который читается результирующая последовательность. Назначение итератора вывода – фиксировать измененное состояния исходных последовательностей, такой формат работы нельзя организовать в функциональном программировании, при манипуляциями константами. Потому, каждый раз необходимо создавать новую последовательность. В результате этого аналоги алгоритмов STL, в MPL вынуждены иметь несколько изменненную логику работы: записывать выходные данные в новую последовательность, тип которой может отличается от входной последовательности. MPL использует для решения этой проблемы механизм вставок, что позволяет гибко настраивать алгоритм для решения конкретной задачи.

Прообразом «вставок» является семейство выводо- итераторо-создающих функций адаптеров STL, которые включает в себя std::front_inserter и std::back_inserter.

Вставки это не более чем тип с двумя вложенными элементами типами:

  • ::state: представление информации осуществляется посредством алгоритма;

  • ::operation: бинарная операция используется для создания нового «::state» из отдельного элемента выходной последовательности и текущего «::state».

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