BOOST_FUSION_ADAPT_STRUCT для базового класса
От: PM  
Дата: 13.10.14 14:44
Оценка:
Всем привет,

Есть 2 структуры, одна унаследована от другой. Хочу получить для обеих boost::fusion::vector, пытаюсь задействовать BOOST_FUSION_ADAPT_STRUCT:

struct A
{
    int x;
};

struct B : A
{
    bool y;
};

BOOST_FUSION_ADAPT_STRUCT(A, (int, x))
BOOST_FUSION_ADAPT_STRUCT(B, (int, A::x) (bool, y))


Можно ли адаптировать B указав что это наследник A чтобы не перечислять повторно члены A?
    
BOOST_FUSION_ADAPT_STRUCT(B, A?? (bool, y))


Нашел старую тему в списке рассылки Boost: [fusion] [intro] ADAPT_STRUCT extensions, но код оттуда похоже по каким-то причинам не включен в Boost.Fusion
Re: BOOST_FUSION_ADAPT_STRUCT для базового класса
От: Evgeny.Panasyuk Россия  
Дата: 16.10.14 22:13
Оценка:
Здравствуйте, PM, Вы писали:

PM>Можно ли адаптировать B указав что это наследник A чтобы не перечислять повторно члены A?


Скорей всего готового нет, но при желании можно сделать самому аналог BOOST_FUSION_ADAPT_STRUCT, с необходимыми возможностями.

А там точно нужно иерархия, может достаточно композиции? Плюс, если нужно проходить по полям линейно, а не иерархически, то есть fusion::flatten:
#include <boost/fusion/adapted/struct/define_struct.hpp>
#include <boost/fusion/container.hpp>
#include <boost/fusion/algorithm.hpp>
#include <iostream>

BOOST_FUSION_DEFINE_STRUCT
(
    (),
    Bar,
    (double, z)
    (char, q)
)

BOOST_FUSION_DEFINE_STRUCT
(
    (),
    Foo,
    (int, x)
    (Bar, y)
)

int main()
{
    using namespace std;
    using namespace boost;
    using namespace fusion;

    Foo f(1, Bar(0.5, '!'));

    for_each(flatten(f), [](auto x)
    {
        cout << x << endl;
    });
}
Вывод:
1
0.5
!
Re[2]: BOOST_FUSION_ADAPT_STRUCT для базового класса
От: PM  
Дата: 19.10.14 04:45
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

PM>>Можно ли адаптировать B указав что это наследник A чтобы не перечислять повторно члены A?


EP>Скорей всего готового нет, но при желании можно сделать самому аналог BOOST_FUSION_ADAPT_STRUCT, с необходимыми возможностями.

EP>А там точно нужно иерархия, может достаточно композиции? Плюс, если нужно проходить по полям линейно, а не иерархически, то есть fusion::flatten:

Можно и самому, я даже нашел в boost-users уже готовую реализацию. Можно и переделать иерархию на композицию. Это у меня pet project, так что возможно все

Изначальная задача — RPC на основе собственного бинарного протокола. И чем больше я смотрю на макросы FUSION_ тем больше думаю сделать все на ручной сериализацией структур, или использовать thrift.
Re[3]: BOOST_FUSION_ADAPT_STRUCT для базового класса
От: Evgeny.Panasyuk Россия  
Дата: 19.10.14 18:53
Оценка: 6 (1)
Здравствуйте, PM, Вы писали:

PM>Изначальная задача — RPC на основе собственного бинарного протокола. И чем больше я смотрю на макросы FUSION_ тем больше думаю сделать все на ручной сериализацией структур,


Как раз для такой задачи использовать Fusion достаточно просто — http://rsdn.ru/forum/cpp.applied/5809130.1
Автор: Evgeny.Panasyuk
Дата: 06.10.14
, там всего-то дюжина строк.

PM>или использовать thrift.


Thrift удобен тем, что позволяет связывать разные языки, и там afaik уже есть даже готовые серверы.
Re[4]: BOOST_FUSION_ADAPT_STRUCT для базового класса
От: PM  
Дата: 20.10.14 06:59
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


PM>>Изначальная задача — RPC на основе собственного бинарного протокола. И чем больше я смотрю на макросы FUSION_ тем больше думаю сделать все на ручной сериализацией структур,


EP>Как раз для такой задачи использовать Fusion достаточно просто — http://rsdn.ru/forum/cpp.applied/5809130.1
Автор: Evgeny.Panasyuk
Дата: 06.10.14
, там всего-то дюжина строк.


Собственно из той темы и решил попробовать boost.fusion Но необходимость адаптировать структуры как-то не впечатляет, и выигрыша по сравнению с сериализацией вручную почти не видно.

PM>>или использовать thrift.


EP>Thrift удобен тем, что позволяет связывать разные языки, и там afaik уже есть даже готовые серверы.


Спасибо, посмотрю.
Re[5]: BOOST_FUSION_ADAPT_STRUCT для базового класса
От: Evgeny.Panasyuk Россия  
Дата: 20.10.14 14:53
Оценка:
Здравствуйте, PM, Вы писали:

EP>>Как раз для такой задачи использовать Fusion достаточно просто — http://rsdn.ru/forum/cpp.applied/5809130.1
Автор: Evgeny.Panasyuk
Дата: 06.10.14
, там всего-то дюжина строк.

PM>Собственно из той темы и решил попробовать boost.fusion Но необходимость адаптировать структуры как-то не впечатляет, и выигрыша по сравнению с сериализацией вручную почти не видно.

Если нужна только сериализация, то от BOOST_FUSION_ADAPT_STRUCT не так много пользы, считай тоже самое повторение всех полей, что и при реализации serialize вручную.
Польза появляется, если например структуру нужно не только сериализовывать, а например, брать хэш, или реализовывать operator<, operator== и т.п.

Зато при использовании BOOST_FUSION_DEFINE_STRUCT — поля описываются только один раз.
Собственно, если твои структуры это просто набор полей, несвязанных общим инвариантом — то почему бы не использовать DEFINE_STRUCT?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.