【问题标题】:What is the reason why boost::mpl doesn't use (and is even not compatible with) std::pair?boost::mpl 不使用(甚至不兼容)std::pair 的原因是什么?
【发布时间】:2018-07-07 11:33:21
【问题描述】:

在一个关于boost::mpl::map 的简单问题How to get *any* example of boost::mpl::map working? 上花了很多时间后,我不明白为什么boost 在他们的MPL 实现中不包含std::pair。我知道,他们可能会遗漏标准对中的点点滴滴,但肯定可以包含适应std::pair 的代码。

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

这种现象不仅限于std::pair。据我了解,std::tupleboost::mpl::vector 非常相似,但两种类型都不会在 boost 库中互操作。

正如How to get *any* example of boost::mpl::map working? 上的@lisyarus 所指出的,不同之处在于,与std:: 版本相比,boost::mpl::pair 从未打算存储值。但我仍然不明白 - 不存储值是否也意味着它必须保持正确的类型?如果我关心的只是类型,我仍然可以使用std::pair 及其::first::second 成员并简单地丢弃运行时值。

【问题讨论】:

  • “问题 2:有没有希望,Boost 最终会在他们的 MPL 中使用标准容器?” - 您将不得不向 Boost 人员询问。你为什么不呢?他们可以回答,我们不能。
  • @PasserBy 你是对的。问题已编辑。

标签: c++ boost metaprogramming c++-standard-library


【解决方案1】:

但他们肯定可以包含适应 std::pair 的代码

一种常用的变体是使用 EBO(空基类优化)来减小大小。你不能“调整”标准库对来做同样的事情。

作为@lisyarus 关于如何获得任何 boost::mpl::map 示例的工作?指出,不同之处在于,与 std:: 版本相比,boost::mpl::pair 从未打算存储值。

准点。 MPL = 元编程库。元编程处理编译时“值”——它们将被编码为类型¹

但我还是不明白——不存储值是否也意味着它必须保持正确的类型?

当然可以。然而,这并不是 Boost MPL 的设计目的。

如果您正在寻找桥接纯类型操作运行时值的库,那么您很幸运:该库称为 Boost Fusion。而且,不出所料,Boost Fusion确实std::pair 改编为融合序列(如果您包含)

#include <boost/fusion/adapted/std_pair.hpp>

如果我只关心类型,我仍然可以使用 std::pair 及其 ::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 的编写/设计晚了很多

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2012-05-06
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2019-08-29
    • 2016-03-14
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多