2013-11-25 40 views
3

我很痛苦地試圖學習boost融合,我不明白zip_view和zip函數的結果之間的區別。boost :: fusion :: zip函數vs boost :: fusion :: zip_view

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 '。 'result_of :: zip'似乎在內部使用'vector2'而不是'vector',所以如果你在'vec1','vec2'和'sequences'中使用'vector2',那麼類型看起來是相同的([live example] (http://coliru.stacked-crooked.com/a/e2bc2f794e33c64c))。希望有人知道更多會給你一個更好的答案。 – llonesmiz

+0

@cv_and_he:thx,至少你現場的例子演示了diff。我也嘗試過使用type_info,但是使用g ++(即使名稱爲demangling),輸出也太神祕了。我也將更正我的問題中的序列typedef。 – Laurent

+1

Ok'vector2'只是2個元素向量的編號形式。 'vector'是可變形式。我在這裏理解的是'result_of :: zip :: type'將使用矢量的編號形式,並且zip_view將使用給定序列的類型,因此在這裏:vector的可變形式('vector Laurent

回答

2

我希望(爲什麼用zip_view代替zip)我可以回答你的第二個問題。

問題是zip產生一個元組序列,其中包含常量對各壓縮序列元素的引用。在你的例子中,它是vector2<const int&, const char&>

相比之下,由zip_view爲每個元素生成的元組中的引用與視圖構造函數中的壓縮序列具有相同的const限定符。你的情況將會是vector<int&, char&>

其結果是,允許zip_view東西zip不支持:壓縮序列的元素的

  1. 變形;
  2. 選擇要修改的序列。
相關問題