2015-11-11 30 views
1

我已經有了一個給定tuple的模板,並且index_sequence可以創建具有由該序列索引的元素的新的tuple。這個函數模板被稱爲projectC++從索引不在給定索引中的元素構造元組序列

我想如果我能以某種方式計算兩條index_sequence當時的我做的區別:我傳給projectmake_index_sequence<original_tuple_t>,差異給定的一個,這是假定排序的和獨特的。

這是一個很好的方法嗎?你知道如何實現這個嗎?

+0

是否對過濾器順序進行排序? – TartanLlama

+0

是的,我們可以假設它是排序和唯一的。 – Midiparse

回答

1

這是一個可能的實現。

首先,我們將開始與一個簡單的特質爲std::size_t添加到std::index_sequence的面前:

template <std::size_t First, typename Seq> 
struct sequence_cat; 

template <std::size_t First, std::size_t... Seq> 
struct sequence_cat <First, std::index_sequence<Seq...>> { 
    using type = std::index_sequence<First, Seq...>; 
}; 

//helper 
template <std::size_t First, typename Seq> 
using sequence_cat_t = typename sequence_cat<First, Seq>::type; 

現在,我們將定義一個名爲not_in_sequence特徵,這將遞歸查詢兩std::index_sequence戰線S和濾除任何從第一發生在第二:

//empty first sequence 
template <class First, class Second> 
struct not_in_sequence { 
    using type = std::index_sequence<>; 
}; 

//helper 
template <class First, class Second> 
using not_in_sequence_t = typename not_in_sequence<First, Second>::type; 

//filter and recurse 
template <std::size_t... First, std::size_t... Second, 
      std::size_t FirstHead, std::size_t SecondHead> 
struct not_in_sequence <std::index_sequence<FirstHead, First...>, 
         std::index_sequence<SecondHead, Second...>> { 
    using seq1 = std::index_sequence<First...>; 
    using seq2 = std::index_sequence<Second...>; 

    using type = 
     std::conditional_t< 
      (FirstHead == SecondHead), 
      not_in_sequence_t<seq1, seq2>, 
      sequence_cat_t< 
       FirstHead, 
       not_in_sequence_t<seq1, sequence_cat_t<SecondHead, seq2>> 
      > 
     >; 
}; 
//empty second sequence 
template <std::size_t... First, std::size_t FirstHead> 
struct not_in_sequence <std::index_sequence<FirstHead, First...>, 
         std::index_sequence<>> { 
    using type = std::index_sequence<FirstHead, First...>; 
}; 

可以使用not_in_sequence_t像這樣:

not_in_sequence_t<std::make_index_sequence<3>, std::index_sequence<0,2>> 
//same as std::index_sequence<1> 

可能有一些邊緣案例我錯過了,但隨意編輯這個只要你喜歡。

Live Demo