這是一個可能的實現。
首先,我們將開始與一個簡單的特質爲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
是否對過濾器順序進行排序? – TartanLlama
是的,我們可以假設它是排序和唯一的。 – Midiparse