![]() |
![]() ![]() ![]() ![]() |
![]() |
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 ::
реклама |