boost::MPL和boost::fusion的区别

11

我是一名新手,对于boost::fusion和boost::mpl库还不太熟悉。请问有人可以告诉我这两个库的主要区别吗?

到目前为止,我只使用了fusion::vector和其他几个简单的内容。现在我想使用fusion::map或者MPL::map,但我不知道该如何选择合适的一个。

我需要将简单类型映射到复杂类型(类型别名)。目前我有以下代码片段,它们都完全满足我的需求。

boost::fusion:

typedef boost::fusion::map<
    boost::fusion::pair<AliasNames::test1,int>,
    boost::fusion::pair<AliasNames::test2,double>,
    boost::fusion::pair<AliasNames::test3,float>
> TmapAssociations1;

typedef boost::fusion::result_of::value_at_key<TmapAssociations,AliasNames::test1>::type t;

boost::MPL:

typedef boost::mpl::map<
    boost::mpl::pair<AliasNames::test1,int>,
    boost::mpl::pair<AliasNames::test2,double>,
    boost::mpl::pair<AliasNames::test3,float>
> TmapAssociations2;

boost::mpl::at<TmapAssociations2,AliasNames::test1>::type t2;

MPL和Fusion之间有什么区别吗?是否存在一些场景,其中一个库优于另一个库?

谢谢回复。

2个回答

10

来自 Fusion(两者中较新的)的 introduction

STL 容器处理值。MPL 容器处理类型。Fusion 容器处理类型和值。

在进行纯类型计算时,请选择 MPL。一旦静态类型计算完成,您可以为运行时部分实例化 Fusion 序列(请参见 Conversion)。

在您的示例中,两种方式都可以。如果您有更复杂的需求,也许 Fusion 可以为您做一些额外的事情(在运行时)。但就目前而言,我会坚持使用 MPL。


谢谢你的回答和链接。我不得不错过这个页面。 - Ludek Vodicka
在进行纯类型计算时,为什么你选择MPL而不是Fusion?是因为性能的原因吗? - Deqing
@Deqing:首先,请记住我是五年前写的这篇答案。其次,是的,当进行纯类型计算时,我确实更喜欢使用MPL,不是因为性能,而是因为我发现(或者至少曾经发现)它更容易使用。 - John Zwinck

1
Boost.Fusion的作用在于弥合编译时数据结构和运行时实例之间的差距。它基本上是一个具有关联算法的语义丰富的类似元组的数据结构库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接