首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个序列初始化Boost.Fusion序列的元素

从另一个序列初始化Boost.Fusion序列的元素
EN

Stack Overflow用户
提问于 2012-01-12 19:40:30
回答 2查看 629关注 0票数 1

我得到了一个需要初始化的Boost.Fusion元素序列,每个元素都有另一个序列的元素。当我不使用Fusion时,它将如下所示:

代码语言:javascript
复制
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) {}
};

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

代码语言:javascript
复制
BVector b( transform( AVector(), magic_functor() ) );

在这个想法中,magic_functorAi的结果类型应该是Bi,并在其operator()中执行构造。但是,magic_functor必须知道要强制转换的正确类型,这将导致重复的逻辑。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-12 20:56:26

如果我理解正确的话,您希望用fusion::vector替换您的类,如下所示:

代码语言:javascript
复制
typedef boost::fusion::vector<A1, A2, A3> A;
typedef boost::fusion::vector<B1, B2, B3> B;

在这种情况下,您可以简单地使用vector's "copy" constructorA初始化B (它不是一个真正的复制构造函数,因为它可以接受任何正向序列):

代码语言:javascript
复制
A a(A1(...), A2(...), A3(...)); // instance of A
B b(a);                         // each element of b is initialized from the 
                                //corresponding element in a

应该注意的是,AB甚至不需要是同一种序列:您可以从fusion::list初始化fusion::vector,或者从myCustomForwardSequence初始化fusion::set

票数 1
EN

Stack Overflow用户

发布于 2012-01-12 20:14:43

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

代码语言:javascript
复制
BVector b(no_init);
boost::fusion::copy( a, b );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8834479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档