gpt4 book ai didi

c++ - boost::fusion 的目的是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:06 24 4
gpt4 key购买 nike

我花了一天的时间阅读笔记并观看有关 boost::fusion 的视频,但我真的不了解它的某些方面。

例如,boost::fusion::has_key<S>功能。在 boost::fusion 中有这个的目的是什么?我们只是尝试将尽可能多的编程移动到编译时发生的想法吗?几乎所有 boost::fusion函数与运行时版本相同,只是它现在在编译时求值? (我们假设在编译时做更多的事情是好的?)。

与 boost::fusion 相关,我也有点困惑为什么元函数总是返回类型。这是为什么?

最佳答案

另一种看待 boost::fusion 的方式是将其视为“穷人自省(introspection)”库。 boost::fusion 的最初动机来自 boost::spirit 解析器/生成器框架的方向,特别是需要支持所谓的“解析器属性”。

想象一下,您有一个要解析的 CSV 字符串:

aaaa, 1.1

这个字符串解析成的类型可以描述为“字符串和 double 元组”。我们可以使用老式结构( struct { string a; double b; } 或更新的 tuple<string, double> )在“普通”C++ 中定义此类元组。我们唯一缺少的是某种适配器,它将允许将任意组合的元组(和一些其他类型)传递给统一的解析器接口(interface),并期望它在不传递任何带外信息(例如字符串)的情况下理解它scanf 使用的解析模板)。

这就是 boost::fusion 发挥作用的地方。构建“fusion 序列”最直接的方法是采用普通结构:

struct a {
string s;
double d;
};
BOOST_FUSION_ADAPT_STRUCT(a, (string, s)(double, d))

“ADAPT_STRUCT”宏为解析器框架(在本例中)添加了必要的信息,以便能够“迭代”struct a 的成员。调整以下问题:

  1. 我刚刚解析了一个字符串。我可以将它分配给 struct a 的第一个成员吗? ?

  2. 我刚刚解析了一个 double 值。我可以将它分配给 struct a 的第二个成员吗? ?

  3. struct a中还有其他成员吗?还是应该停止解析?

显然,这个基本示例可以进一步扩展(并且 boost::fusion 提供了能力)以解决更复杂的情况:

  1. 变体 - 假设解析器可能遇到 sting 或 double,并希望将其分配给 struct a 的正确成员. BOOST_FUSION_ADAPT_ASSOC_STRUCT来拯救(现在我们的解析器可以问这样的问题:“struct a 的哪个成员是 double 类型?”)。

  2. 转换 - 我们的解析器可以设计为接受某些类型作为参数,但程序的其余部分已经发生了很大变化。然而, fusion 元函数可以方便地用于使新类型适应旧现实(反之亦然)。

其余的 boost::fusion 功能自然遵循上述基础知识。当需要将“松散 IO 数据”(在任一方向上)转换为 C++ 程序运行的强类型/结构化数据时(如果关注效率), fusion 真正发挥作用。这是 spirit::qi 和 spirit::karma 成为如此高效(可能是最快的)I/O 框架背后的促成因素。

关于c++ - boost::fusion 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20646114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com