Информация об изменениях

Сообщение Re: Статья "Type Driven Wire Protocols with Boost Fusion" от 06.10.2014 10:51

Изменено 06.10.2014 10:54 Evgeny.Panasyuk

Здравствуйте, PM, Вы писали:

PM>Как и следует из названия, автор использует Boost.Fusion для compile-time reflection чтобы парсить данные бинарного протокола в структуры. Поддерживаются примитивные типы, строки, массивы, поля переменной длины, необязательные поля, вложенные структуры, т.е. всё, что используется в типичных бинарных протоколах.


Тут нет ничего не обычного, достаточно знать возможности Boost.Fusion, а всё остальное механически вытекает из этих возможностей.
Вот, например, "вся сериализация" на базе Boost.Fusion:
template<typename Archive, typename T>
    typename enable_if
    <
        fusion::traits::is_sequence<T>
    >::type
serialize(Archive &archive, T &xs)
{
    fusion::for_each(xs, [&](auto &x)
    {
        serialize(archive, x);
    });
}

Я думаю многие здесь на форуме уже использовали Fusion для подобных задач. Например:

http://rsdn.ru/forum/cpp/5413524.1


Сейчас всё ядро сериализации — это in/out archive (которые пришлось бы писать в любом случае) + рекурсивная сериализация Boost.Fusion Forward Sequence. На всё про всё — меньше ста строк.
Структуры определяются просто как BOOST_FUSION_DEFINE_STRUCT и уже готовы к сериализации.

Re: Статья "Type Driven Wire Protocols with Boost Fusion"
Здравствуйте, PM, Вы писали:

PM>Как и следует из названия, автор использует Boost.Fusion для compile-time reflection чтобы парсить данные бинарного протокола в структуры. Поддерживаются примитивные типы, строки, массивы, поля переменной длины, необязательные поля, вложенные структуры, т.е. всё, что используется в типичных бинарных протоколах.


Тут нет ничего особенного, достаточно знать возможности Boost.Fusion, а всё остальное механически вытекает из них.
Вот, например, "вся сериализация" на базе Boost.Fusion:
template<typename Archive, typename T>
    typename enable_if
    <
        fusion::traits::is_sequence<T>
    >::type
serialize(Archive &archive, T &xs)
{
    fusion::for_each(xs, [&](auto &x)
    {
        serialize(archive, x);
    });
}

Я думаю многие здесь на форуме уже использовали Fusion для подобных задач. Например:

http://rsdn.ru/forum/cpp/5413524.1


Сейчас всё ядро сериализации — это in/out archive (которые пришлось бы писать в любом случае) + рекурсивная сериализация Boost.Fusion Forward Sequence. На всё про всё — меньше ста строк.
Структуры определяются просто как BOOST_FUSION_DEFINE_STRUCT и уже готовы к сериализации.