我有一个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
的{{1}}的结果类型为Bi
,并在其Ai
中执行构造。
但是,operator()
必须知道要转换为正确的类型,这将导致重复的逻辑。
有没有更好的融合方式 - 初始化?
答案 0 :(得分:1)
如果我理解正确,您希望用fusion::vector
替换您的类,如下所示:
typedef boost::fusion::vector<A1, A2, A3> A;
typedef boost::fusion::vector<B1, B2, B3> B;
在这种情况下,您可以简单地使用vector
's "copy" constructor从B
初始化A
(它不是真正的复制构造函数,因为它可以接受任何正向序列):
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
的{{1}}。
答案 1 :(得分:0)
你可以创建一个未初始化的b版本(可能需要特殊的构造函数),然后只使用copy:
BVector b(no_init);
boost::fusion::copy( a, b );