boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?

What is the reason why boost::mpl doesn't use (and is even not compatible with) std::pair?

本文关键字:air std 是什么 不兼容 mpl boost      更新时间:2023-10-16

在一个简单的问题上花费了很多小时之后 如何获得 boost::mpl::map 工作的*任何*示例? 关于boost::mpl::map我不明白为什么 boost 在他们的 MPL 实现中不接受std::pair。我知道,他们可能会错过标准对中的零碎内容,但可以肯定的是,他们可以包含适应std::pair的代码。

毕竟,std::pair是语言的一部分。

这种现象不仅限于std::pair。据我了解,std::tupleboost::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 晚得多