在一个简单的问题上花费了很多小时之后 如何获得 boost::mpl::map 工作的*任何*示例? 关于boost::mpl::map
我不明白为什么 boost 在他们的 MPL 实现中不接受std::pair
。我知道,他们可能会错过标准对中的零碎内容,但可以肯定的是,他们可以包含适应std::pair
的代码。
毕竟,std::pair
是语言的一部分。
这种现象不仅限于std::pair
。据我了解,std::tuple
与boost::mpl::vector
非常相似,但这两种类型从未在 boost 库中互操作。
正如@lisyarus如何获得 boost::mpl::map 工作的*任何*示例? 指出,不同之处在于,与std::
版本相比,boost::mpl::pair
从来都不是为了存储值。但我仍然不明白 - 存储值是否也意味着它必须保持正确的类型?如果我关心的只是类型,我仍然可以使用std::pair
及其::first
和::second
成员,只需丢弃运行时值。
但可以肯定的是,它们可以包含一个适应std::p air
的代码
一个常用的变体是使用 EBO(空基类优化(来减小大小。您不能"调整"标准库对来执行相同的操作。
正如@lisyarus如何获得任何 boost::mpl::map 工作的例子?指出的那样,不同之处在于与 std:: 版本相比,boost::mpl::p air 从来都不是为了存储值。
当场。MPL = 元编程库。元编程处理编译时"值" - 这些值将以类型¹编码
但我仍然不明白 - 存储值是否也意味着它必须保持正确的类型?
是的,当然。然而,这不是Boost MPL的设计目的。
如果你正在寻找一个库来桥接纯类型操作和运行时值,那么你很幸运:这个库叫做Boost Fusion。而且,不出所料,如果你包括,Boost Fusion确实会std::pair
适应为融合序列。
#include <boost/fusion/adapted/std_pair.hpp>
如果我关心的只是类型,我仍然可以使用 std::p air 及其 ::first 和 ::second 成员,并简单地丢弃运行时值。
是的,你可以。但是你不需要Boost MPL。同样,为了桥接它,请考虑使用Boost Fusion。
注意更现代的是使用Boost Hana,它就像Boost Fusion和MPL的组合,但具有C++11/14样式:
Hana 是一个用于C++元编程的纯标头库,适用于 对类型和值的计算。它提供的功能 是成熟的 Boost.MPL 提供的超集 和 Boost.Fusion 库。通过利用 C++11/14 实施 技术和习语,Hana拥有更快的编译时间和 运行时性能与以前的元编程相当或更好 库,同时显着提高了 过程。Hana 易于以临时方式扩展,它提供 与 Boost.Fusion、Boost.MPL 和 标准库。
¹ 好吧,直到constexpr
评估,但这比编写/设计的 Boost MPL 晚得多