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

我用融合向量实现这一点的唯一想法是

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

在这个想法中,magic_functor将有一个结果类型Bifor anAi并在其中执行构造operator()。但是,magic_functor必须知道要转换为的正确类型,这将导致重复的逻辑。

有没有更好的方法来融合初始化?

4

2 回答 2

1

如果我理解正确,您想用fusion::vectors 替换您的类,如下所示:

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

需要注意的是AandB甚至不需要是同一种序列:你可以从 a 初始化 a fusion::vectorfusion::list或者fusion::set从 a 初始化 a myCustomForwardSequence

于 2012-01-12T12:56:26.367 回答
0

您可以创建 b 的未初始化版本(可能需要特殊的构造函数),然后只使用复制:

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