提问人:alfC 提问时间:6/21/2019 更新时间:6/21/2019 访问量:55
Fusion有尾巴功能吗?
Does Fusion have a tail function?
问:
我需要一个类似尾巴的函数,可以这样使用:
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 );
答:
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_front
pop_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
评论