2012-01-12 29 views
1

Boost.Fusionシーケンスの要素を別のシーケンスの要素で初期化する必要があります。融合ベクターでこれを実現するための私の唯一のアイデアは、このアイデアでBoost.Fusionシーケンスの要素を別のシーケンスから初期化する

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

のようなものである

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) {} 
}; 

magic_functorは結果タイプを持っているでしょう:私は核融合を使用していないだろうときに、これは次のようになります。 BiAiとし、その構成をoperator()で実行します。 しかし、magic_functorは、キャストする正しいタイプを知っていなければならず、その結果ロジックが重複します。

初期化を行うと、より良い融合方法がありますか?

答えて

1

私が正しく理解していれば、あなたはfusion::vector秒であなたのクラスを交換したい、のようなこの:

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

、あなたは、単にvector's "copy" constructorを使用してAからBを初期化することができます(それは任意の前方順序を受け入れることができるので、それは本物のコピーコンストラクタではありません):

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

ABが配列であっても、同じ種類である必要はないことに注意する必要があります。あなたはmyCustomForwardSequenceからfusion::list、またはfusion::setからfusion::vectorを初期化することができます。

+0

どうもありがとうございました。 – thiton

0

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

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

なぜデフォルトで 'b'を' a'で直接初期化できるのでしょうか? 'BVector b(a);' –

+0

@LucTourailleこれは、BVectorが融合のベクターであるか、あるいは他の融合容器であれば真です。しかし、問題はそれを特定していない。 – dsign

+0

質問から引用:「私はBoostを持っています。要素の融合シーケンス」、「これをFusionベクトルで実現する」、「初期化を融合する」。私は、Fusionシーケンスを扱っていることは明らかです。:)すべてのシーケンスは、フォワードシーケンスから初期化するコンストラクタを提供します。 –

関連する問題