Инициализация элементов последовательности Boost.Fusion из другой последовательности - PullRequest
1 голос
/ 12 января 2012

У меня есть последовательность элементов Boost.Fusion, которую нужно инициализировать по одному с элементами другой последовательности.Если бы я не использовал Fusion, это выглядело бы следующим образом:

class A {
    A1 a;
    A2 b;
    A3 c;
};

class B {
    B1 a; 
    B2 b;
    B3 c;

    B( const A& o ) : a(o.a), b(o.b), c(o.c) {}
};

Моя единственная идея реализовать это с помощью векторов Fusion - это что-то вроде

BVector b( transform( AVector(), magic_functor() ) );

В этой идее magic_functorбудет иметь тип результата Bi для Ai и выполнить построение в его operator().Тем не менее, magic_functor должен знать правильный тип для приведения к нему, что приведет к дублированию логики.

Есть ли лучший способ слияния с инициализацией?

Ответы [ 2 ]

1 голос
/ 12 января 2012

Если я правильно понимаю, вы хотите заменить ваши классы на fusion::vector s, например:

typedef boost::fusion::vector<A1, A2, A3> A;
typedef boost::fusion::vector<B1, B2, B3> B;

В этом случае вы можете инициализировать B из A, просто используя vector конструктор «копирования» (это не настоящий конструктор копирования, поскольку он может принимать любую последовательность вперед ):

A a(A1(...), A2(...), A3(...)); // instance of A
B b(a);                         // each element of b is initialized from the 
                                //corresponding element in a

Следует отметить, что A и B даже не обязательно должны быть одной и той же последовательностью: вы можете инициализировать fusion::vector из fusion::list или fusion::set из myCustomForwardSequence .

0 голосов
/ 12 января 2012

Вы можете создать неинициализированную версию b (для этого может потребоваться специальный конструктор), а затем просто использовать copy:

BVector b(no_init);
boost::fusion::copy( a, b );
...