![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Quick StartBoost , Chapter 1. Fusion 2.2 , Chapter 1. Fusion 2.2
|
![]() |
Caution |
---|---|
Результатом< |
<
является общим. С<for_each
>print_xml
>вы можете использовать его для печати практически любой последовательности.
Давай поумнеем немного. Скажем, мы хотим написатьобщуюфункцию, которая принимает в произвольной последовательности и XML печатает только те элементы, которые являются указателями. Полегче. Во-первых, давайте включим черту типа<is_pointer
>повышения:
#include <boost/type_traits/is_pointer.hpp>
Тогда просто:
template <typename Sequence> void xml_print_pointers(Sequence const& seq) {for_each
(filter_if
<boost::is_pointer<_> >(seq), print_xml()); }
<
— ещё один алгоритм Fusion. Он возвращает<filter_if
>filter_view
>, соответствующую последовательность слияния. Эта точка зрения отражает только те элементы, которые проходят данный предикат. В этом случае предикат<boost::is_pointer<_>
>. Затем этот «фильтрированный вид» передается алгоритму<for_each
>, который затем печатает «фильтрированный вид» как XML.
Полегче, да?
Хорошо, двигаемся дальше...
Помимо<
, слияние имеет несколько других типов последовательностей на выбор. Каждая последовательность имеет свои особенности. У нас есть<vector
>
,<list
>
,<set
>
, плюс множество<map
>views
>, которые обеспечивают различные способы представления последовательностей.
<
Фьюжн связывает типы с элементами. Его можно использовать в качестве замены<map
>struct
>. Пример:
namespace fields { struct name; struct age; } typedefmap
<fusion::pair
<fields::name, std::string> ,fusion::pair
<fields::age, int> > person;
<
является ассоциативной последовательностью. Его элементы представляют собой пары Fusion, которые несколько отличаются от<map
>std::pair
>. Пары слияния содержат только один элемент, с типом их второго параметра шаблона. Параметр первого типа пары используется в качестве индекса к связанному элементу в последовательности. Например, при наличии<a_person
>типа<person
>вы можете:
using namespace fields; std::string person_name =at_key
<name>(a_person); int person_age =at_key
<age>(a_person);
Зачем проходить через все эти неприятности, скажете вы? Во-первых, в отличие от<struct
>, мы имеем дело с общей структурой данных. В вашем распоряжении есть множество возможностей, предоставляемых из коробки с синтезом или написанных другими. Например, с этими удобствами интроспекция предоставляется бесплатно. Мы можем написать одну функцию сериализации (ну, две, если учесть загрузку и сохранение), которая будет работать для всего вашего синтеза<
с. Пример:map
>
struct saver
{
template <typename Pair>
void operator()(Pair const& data) const
{
some_archive << data.second;
}
};
template <typename Stuff>
void save(Stuff const& stuff)
{
for_each
(stuff, saver());
}
Функция<save
>является общей и будет работать для всех типов<stuff
>независимо от того, является ли она<person
>,<dog
>или целым<alternate_universe
>.
И... мы едва поцарапали поверхность! Вы можете составлять и расширять структуры данных, удалять элементы из структур, находить конкретные типы данных, запрашивать элементы, отфильтровать типы для проверки, трансформировать структуры данных и т. Д. То, что вы видели, это только верхушка айсберга.
<
Если вы хотите иметь больше контроля над тем, какие компоненты включать (см. разделОрганизациядля деталей).vector
>
Статья Quick Start раздела Chapter 1. Fusion 2.2 Chapter 1. Fusion 2.2 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 1. Fusion 2.2 ::
реклама |