1

別のシーケンスの要素でそれぞれ 1 つずつ初期化する必要がある要素の 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() ) );

このアイデアでは、 for のmagic_functor結果タイプがあり、その で構築を実行します。ただし、キャスト先の正しい型を知る必要があるため、ロジックが重複します。BiAioperator()magic_functor

初期化を融合化するより良い方法はありますか?

4

2 に答える 2

1

fusion::vector私の理解が正しければ、次のようにクラスを sに置き換えます。

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

この場合、単にの「コピー」コンストラクターBを使用してから初期化できます(任意の順方向シーケンスを受け入れることができるため、実際のコピー コンストラクターではありません)。Avector

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

とは同じ種類のシーケンスである必要さえないことに注意してくださいA。 aから a 、または aからa を初期化できます。Bfusion::vectorfusion::listfusion::setmyCustomForwardSequence

于 2012-01-12T12:56:26.367 に答える
0

初期化されていないバージョンの b を作成し (そのためには特別なコンストラクターが必要になる場合があります)、コピーを使用するだけです。

BVector b(no_init);
boost::fusion::copy( a, b );
于 2012-01-12T12:14:43.310 に答える