Fusion有尾巴功能吗?

Does Fusion have a tail function?

提问人:alfC 提问时间:6/21/2019 更新时间:6/21/2019 访问量:55

问:

我需要一个类似尾巴的函数,可以这样使用:

boost::fusion::vector<char, int, float> a('a', 12, 5.5f);
boost::fusion::vector<int, float> b(12, 5.5f);

boost::fusion::copy( Tail(a), b );
C++ C++11 提升融合

评论


答:

1赞 Justin 6/21/2019 #1

Boost Fusion 的文档中,“算法”下有一个名为“转换”的部分。这里列出的函数特别包括一个称为pop_front的函数。这似乎正是我们想要的:

返回一个新序列,删除原始元素的第一个元素。

assert(pop_front(make_vector(1,2,3)) == make_vector(2,3));

举个例子:

boost::fusion::vector<char, int, float> a('a', 12, 5.5f);
boost::fusion::vector<int, float> b(12, 5.5f);

boost::fusion::copy( boost::fusion::pop_front(a), b );

这个名字有点奇怪,因为它实际上并没有修改输入序列,而是返回一个修改后的结果。但是,它来自C++标准库,用于删除集合的第一个元素,例如 std::list::p op_front。Boost Fusion 选择这个名称是为了与标准库“更一致”。pop_frontpop_front

评论

0赞 alfC 6/21/2019
奇怪的名字,因为该库非常实用。:)
1赞 Justin 6/21/2019
@alfC是的。许多 C++ 库使用 C++ 标准库中的名称,即使它们是功能性的
1赞 Justin 6/22/2019
@alfC 我不相信它确实会复制。 “复杂性:恒定的。返回延迟计算的视图。
1赞 Justin 6/22/2019
@alfC 您可以看到它没有执行额外的复制: godbolt.org/z/ZglilB .但是,由于它返回一个常量视图,因此无法从中移动:godbolt.org/z/GbxHt5
1赞 alfC 6/22/2019
抱歉,在文档中没有看到“视图”备注。可惜它没有在视图上移动。我会使用它,因为我将其用于 spiri x3 解析器语义操作,并且通常应将属性移动到目标中,因为它们在解析后未使用。我认为 Fusion 仍然需要对 C++11 进行一些升级,在这种情况下是某种编译时移动迭代器/移动范围。val