boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?
What is the reason why boost::mpl doesn't use (and is even not compatible with) std::pair?
在一个简单的问题上花费了很多小时之后 如何获得 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 晚得多
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- C++:无法使用 "=" 运算符更改 std::p air 的值
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 使用 std::p air 进行返回值优化
- 标准::在双类和类的 std::p air 上更大
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- 查找 std::vector 中的最小值和最大值 std::p air
- 地图是否将元素存储为 std::p air?
- std::p air 会破坏其动态分配的对象吗?
- 如何在 std::p air 中使用 System::Guid 和自定义枚举?
- boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?
- 在具有 std::p air 键和值的映射中添加 b2vec2
- 无法访问 std::p air 的成员秒
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 二进制">>":未找到采用类型为"std::p air<int,int>"的右操作数的运算符
- 通过预处理器创建 std::p air<std::string,some_enum>
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- 如何使用 swig 类型映射将 std::vector<std::p air<std::string, int> > 从 java 返回到 c++
- 从"void"转换为非标量类型"std::p air<std::basic_string<字符,std::char_traits<char>