2012-01-12 1 views
1

У меня есть последовательность Boost.Fusion элементов, которые необходимо инициализировать каждый с элементами другой последовательности. Когда я не хотел бы использовать Fusion, это будет выглядеть так:Инициализация элементов последовательности Boost.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 должен был бы знать правильный тип, который должен выполняться, что приведет к дублированию логики.

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

ответ

1

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

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

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

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

Спасибо большое, отлично работал. – thiton

0

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

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

Почему по умолчанию инициализируется 'b', когда вы можете инициализировать его непосредственно с помощью' a'? 'BVector b (a);' –

+0

@LucTouraille Это правда, если BVector является вектором слияния или, возможно, другим контейнером слияния. Но вопрос не указывает на это. – dsign

+0

Цитаты из вопроса: «У меня есть последовательность элементов Boost.Fusion», «реализуйте это с помощью векторов Fusion», «fusion-ifying initialization». Я думаю, что довольно ясно, что мы имеем дело с последовательностями Fusion :). Все последовательности предоставляют конструктор для инициализации из прямой последовательности. –