@@ -100,24 +100,28 @@ template <typename P1, typename P2>
100100using interleaved_pack_t = decltype (interleave_pack(P1{}, P2{}));
101101
102102// / Selects from the pack types that satisfy the Condition
103- template <template <typename > typename Condition, typename Result>
104- constexpr auto select_pack (Result result, pack<>)
103+ // / Multicondition takes the type to check as first template parameter
104+ // / and any helper types as the following parameters
105+ template <template <typename ...> typename Condition, typename Result, typename ... Cs>
106+ constexpr auto select_pack (Result result, pack<>, pack<Cs...>)
105107{
106108 return result;
107109}
108110
109- template <template <typename > typename Condition, typename Result, typename T, typename ... Ts>
110- constexpr auto select_pack (Result result, pack<T, Ts...>)
111+ template <template <typename ... > typename Condition, typename Result, typename T, typename ... Cs , typename ... Ts>
112+ constexpr auto select_pack (Result result, pack<T, Ts...>, pack<Cs...> condPack )
111113{
112- if constexpr (Condition<T>()) {
113- return select_pack<Condition>(concatenate_pack (result, pack<T>{}), pack<Ts...>{});
114+ if constexpr (Condition<T, Cs... >()) {
115+ return select_pack<Condition>(concatenate_pack (result, pack<T>{}), pack<Ts...>{}, condPack );
114116 } else {
115- return select_pack<Condition>(result, pack<Ts...>{});
117+ return select_pack<Condition>(result, pack<Ts...>{}, condPack );
116118 }
117119}
118120
119- template <template <typename > typename Condition, typename ... Types>
120- using selected_pack = std::decay_t <decltype (select_pack<Condition>(pack<>{}, pack<Types...>{}))>;
121+ template <template <typename ...> typename Condition, typename ... Types>
122+ using selected_pack = std::decay_t <decltype (select_pack<Condition>(pack<>{}, pack<Types...>{}, pack<>{}))>;
123+ template <template <typename ...> typename Condition, typename CondPack, typename Pack>
124+ using selected_pack_multicondition = std::decay_t <decltype (select_pack<Condition>(pack<>{}, Pack{}, CondPack{}))>;
121125
122126// / Select only the items of a pack which match Condition
123127template <template <typename > typename Condition, typename Result>
0 commit comments