Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Quick Start

Boost , Chapter 1. Fusion 2.2 , Chapter 1. Fusion 2.2

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Полагаю, читатель уже знаком с кортежами (Boost.Tuple) и их предком.<std::pair>. Кортеж представляет собой обобщение<std::pair>для множественных гетерогенных элементов (тройных, четверных и т.д.). Это более или менее синоним fusion<vector>.

Для начала, мы включим всю последовательность[s]<vector>.:

#include <boost/fusion/sequence.hpp>
#include <boost/fusion/include/sequence.hpp>

Начнем с<vector>:

vector<int, char, std::string> stuff(1, 'x', "howdy");
int i = at_c<0>(stuff);
char ch = at_c<1>(stuff);
std::string s = at_c<2>(stuff);

Замените<tuple>на<vector>и<get>на<at_c>, и это будет точно так же, как. На самом деле, оба названия могут использоваться взаимозаменяемо. Но на этом сходство заканчивается. Вы можете сделать гораздо больше с помощью Fusion<vector>или<tuple>. Давайте посмотрим несколько примеров.

Print the vector as XML

Во-первых, давайте рассмотрим алгоритмы:

#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/include/algorithm.hpp>

Теперь давайте напишем объект функции, который печатает XML формыdataдля каждого члена в наборе.

struct print_xml
{
    template <typename T>
    void operator()(T const& x) const
    {
        std::cout
            << '<' << typeid(x).name() << '>'
            << x
            << "</" << typeid(x).name() << '>'
            ;
    }
};

Наконец-то:

for_each(stuff, print_xml());

Вот так!<for_each>— алгоритм слияния. Это общий алгоритм, похожий наSTL. Он повторяется по последовательности и вызывает функцию, предоставленную пользователем. В нашем случае он вызывает<print_xml><operator()>для каждого элемента<stuff>.

[Caution] Caution

Результатом<typeid(x).name()>является специфика платформы. Код здесь только для экспозиции. Конечно, вы уже знаете, что :-

<for_each>является общим. С<print_xml>вы можете использовать его для печати практически любой последовательности.

Print only pointers

Давай поумнеем немного. Скажем, мы хотим написатьобщуюфункцию, которая принимает в произвольной последовательности и 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());
}

<filter_if>— ещё один алгоритм Fusion. Он возвращает<filter_view>, соответствующую последовательность слияния. Эта точка зрения отражает только те элементы, которые проходят данный предикат. В этом случае предикат<boost::is_pointer<_>>. Затем этот «фильтрированный вид» передается алгоритму<for_each>, который затем печатает «фильтрированный вид» как XML.

Полегче, да?

Associative tuples

Хорошо, двигаемся дальше...

Помимо<vector>, слияние имеет несколько других типов последовательностей на выбор. Каждая последовательность имеет свои особенности. У нас есть<list>,<set>,<map>, плюс множество<views>, которые обеспечивают различные способы представления последовательностей.

<map>Фьюжн связывает типы с элементами. Его можно использовать в качестве замены<struct>. Пример:

namespace fields
{
    struct name;
    struct age;
}
typedef map<
    fusion::pair<fields::name, std::string>
  , fusion::pair<fields::age, int> >
person;

<map>является ассоциативной последовательностью. Его элементы представляют собой пары Fusion, которые несколько отличаются от<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>.

Tip of the Iceberg

И... мы едва поцарапали поверхность! Вы можете составлять и расширять структуры данных, удалять элементы из структур, находить конкретные типы данных, запрашивать элементы, отфильтровать типы для проверки, трансформировать структуры данных и т. Д. То, что вы видели, это только верхушка айсберга.



<vector>Если вы хотите иметь больше контроля над тем, какие компоненты включать (см. разделОрганизациядля деталей).

Если не указано иное, компоненты находятся в пространстве имен<boost::fusion>. Для простоты код в этом быстром запуске подразумевает<using>директивы для компонентов синтеза, которые мы будем использовать.


PrevUpHomeNext

Статья Quick Start раздела Chapter 1. Fusion 2.2 Chapter 1. Fusion 2.2 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 1. Fusion 2.2 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:17:19/0.005112886428833/0