@@ -114,42 +114,43 @@ consteval auto prune_voids_pack(Result result, pack<>)
114114 return result;
115115}
116116
117+ template <typename T>
118+ concept void_pack_element = std::is_void_v<T>;
119+
120+ template <typename T>
121+ concept nonvoid_pack_element = !void_pack_element<T>;
122+
117123// The first one is non void, but one of the others is void
118- template <typename ... Rs, typename T, typename ... Ts>
119- requires (!std::is_void_v<T>)
124+ template <typename ... Rs, nonvoid_pack_element T, typename ... Ts>
120125consteval auto prune_voids_pack (pack<Rs...> result, pack<T, Ts...>)
121126{
122127 return prune_voids_pack (pack<Rs..., T>{}, pack<Ts...>{});
123128}
124129
125130// The first one is void
126- template <typename ... Rs, typename V, typename ... Ts>
127- requires (std::is_void_v<V>)
131+ template <typename ... Rs, void_pack_element V, typename ... Ts>
128132consteval auto prune_voids_pack (pack<Rs...> result, pack<V, Ts...>)
129133{
130134 return prune_voids_pack (pack<Rs...>{}, pack<Ts...>{});
131135}
132136
133137// The first one is non void, but one of the others is void
134- template <typename ... Rs, typename T1, typename T2, typename ... Ts>
135- requires (!std::is_void_v<T1> && !std::is_void_v<T2>)
138+ template <typename ... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, typename ... Ts>
136139consteval auto prune_voids_pack (pack<Rs...> result, pack<T1, T2, Ts...>)
137140{
138141 return prune_voids_pack (pack<Rs..., T1, T2>{}, pack<Ts...>{});
139142}
140143
141144// Eats 4 types at the time
142- template <typename ... Rs, typename T1, typename T2, typename T3, typename T4, typename ... Ts>
143- requires (!std::is_void_v<T1> && !std::is_void_v<T2> && !std::is_void_v<T3> && !std::is_void_v<T4>)
145+ template <typename ... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, nonvoid_pack_element T3, nonvoid_pack_element T4, typename ... Ts>
144146consteval auto prune_voids_pack (pack<Rs...> result, pack<T1, T2, T3, T4, Ts...>)
145147{
146148 return prune_voids_pack (pack<Rs..., T1, T2, T3, T4>{}, pack<Ts...>{});
147149}
148150
149151// Eats 8 types at the time
150- template <typename ... Rs, typename T1, typename T2, typename T3, typename T4,
151- typename T5, typename T6, typename T7, typename T8, typename ... Ts>
152- requires (!std::is_void_v<T1> && !std::is_void_v<T2> && !std::is_void_v<T3> && !std::is_void_v<T4> && !std::is_void_v<T5> && !std::is_void_v<T6> && !std::is_void_v<T7> && !std::is_void_v<T8>)
152+ template <typename ... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, nonvoid_pack_element T3, nonvoid_pack_element T4,
153+ nonvoid_pack_element T5, nonvoid_pack_element T6, nonvoid_pack_element T7, nonvoid_pack_element T8, typename ... Ts>
153154consteval auto prune_voids_pack (pack<Rs...> result, pack<T1, T2, T3, T4, T5, T6, T7, T8, Ts...>)
154155{
155156 return prune_voids_pack (pack<Rs..., T1, T2, T3, T4, T5, T6, T7, T8>{}, pack<Ts...>{});
0 commit comments