ОтличиеMPLАлгоритмы Fusion ленивыи сохранение непоследовательности. Это по дизайну. Эффективность работы имеет высокий приоритет. Как иMPL, и в отличие отSTL, алгоритмы синтеза в основном функциональны по своей природе, так что алгоритмы не мутируют (без побочных эффектов). Однако из-за высокой стоимости возврата полных последовательностей, таких как векторы и списки,Просмотрывозвращаются из алгоритмов Fusion. Например,<transform
>Алгоритм фактически не возвращает преобразованную версию исходной последовательности.<transform
>возвращает<transform_view
>. Эта точка зрения содержит ссылку на исходную последовательность плюс функцию преобразования. Итерация над<transform_view
>будет применять функцию преобразования по отношению к элементам последовательности по требованию. Эта ленивая схема оценкипозволяет нам цеплять столько алгоритмов, сколько мы хотим, не подвергаясь высокому штрафу за время выполнения.
лениваясхема оценки, гдеалгоритмывозвращаютсяВидытакже позволяют таким операциям, как<push_back
>, быть полностью общими. В Fusion<push_back
>на самом деле является общим алгоритмом, который работает на всех последовательностях. Учитывая входную последовательность<s
>и значение<x
>, алгоритм Fusion<push_back
>просто возвращает<joint_view
>: Вид, который содержит ссылку на исходную последовательность<s
>и значение<x
>. Функции, которые когда-то были специфичны для последовательностей и должны быть реализованы N раз по N различных последовательностей, теперь реализованы только один раз. То есть, последовательности Fusion являются дешево расширяемыми.
Для восстановления исходной последовательности предоставляются функцииКонверсия. Вы можете использовать одну изфункций преобразованиядля преобразования обратно в исходный тип последовательности.
#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/include/algorithm.hpp>