我得到了一个需要初始化的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对Ai的结果类型应该是Bi,并在其operator()中执行构造。但是,magic_functor必须知道要强制转换的正确类型,这将导致重复的逻辑。
有没有更好的方法来融合初始化?
发布于 2012-01-12 20:56:26
如果我理解正确的话,您希望用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应该注意的是,A和B甚至不需要是同一种序列:您可以从fusion::list初始化fusion::vector,或者从myCustomForwardSequence初始化fusion::set。
发布于 2012-01-12 20:14:43
您可以创建b的未初始化版本(可能需要特殊的构造函数),然后只需使用copy:
BVector b(no_init);
boost::fusion::copy( a, b );https://stackoverflow.com/questions/8834479
复制相似问题