boost::fusion::zip函数与boost::fusion::zip_view的区别

4

我正在努力学习boost fusion,但我不清楚zip_view和zip函数的结果之间的区别。

namespace fuz = boost::fusion;

typedef fuz::vector<int,int> vec1;
typedef fuz::vector<char,char> vec2;
typedef fuz::vector<vec1&, vec2&> sequences;

typedef fuz::zip_view<sequences> zip_view_type;

typedef fuz::result_of::zip<vec1, vec2>::type zip_result_type;

BOOST_MPL_ASSERT((boost::is_same<zip_view_type, zip_result_type>));
  • 我本以为这两种类型是相同的,但实际上并不是。为什么?

  • zip_view 和 zip 函数似乎非常相关,但我不知道在什么情况下使用视图而不是函数。


1
根据zip_view的文档,sequences应该是fuz::vector<vec1&,vec2&>result_of::zip似乎在内部使用vector2而不是vector,因此如果您在vec1vec2sequences中使用vector2,则类型似乎是相同的(实时示例)。希望更了解的人能给您一个更好的答案。 - llonesmiz
@cv_and_he:谢谢,至少你的实例展示了差异。我也尝试使用type_info,但是使用g++(即使使用名称重整)输出过于晦涩。我还会纠正我的问题中的序列typedef。 - Laurent
1
好的,vector2只是具有2个元素向量编号形式的表述。 vector则是可变参数形式。我的理解是,result_of::zip<vec1, vec2>::type将使用向量的编号形式,而zip_view将使用给定序列的类型,因此在这里:向量的可变参数形式(vector<vec1&, vec2&>)。 - Laurent
1个回答

3
我希望我能回答你的第二个问题(为什么要使用zip_view而不是zip)。
问题在于zip生成的元组序列包含对应的序列元素的常量引用。在你的例子中,它是vector2<const int&, const char&> 相比之下,zip_view中产生的元组引用与视图构造函数中所拼接的序列具有相同的const限定符。在你的情况下,它将是vector<int&, char&>
结果是,zip_view允许一些zip不支持的操作:
  1. 修改已拼接的序列元素;
  2. 选择要修改的序列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接