@@ -114,42 +114,44 @@ 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+
123+
117124// 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>)
125+ template <typename ... Rs, nonvoid_pack_element T, typename ... Ts>
120126consteval auto prune_voids_pack (pack<Rs...> result, pack<T, Ts...>)
121127{
122128 return prune_voids_pack (pack<Rs..., T>{}, pack<Ts...>{});
123129}
124130
125131// The first one is void
126- template <typename ... Rs, typename V, typename ... Ts>
127- requires (std::is_void_v<V>)
132+ template <typename ... Rs, void_pack_element V, typename ... Ts>
128133consteval auto prune_voids_pack (pack<Rs...> result, pack<V, Ts...>)
129134{
130135 return prune_voids_pack (pack<Rs...>{}, pack<Ts...>{});
131136}
132137
133138// 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>)
139+ template <typename ... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, typename ... Ts>
136140consteval auto prune_voids_pack (pack<Rs...> result, pack<T1, T2, Ts...>)
137141{
138142 return prune_voids_pack (pack<Rs..., T1, T2>{}, pack<Ts...>{});
139143}
140144
141145// 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>)
146+ template <typename ... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, nonvoid_pack_element T3, nonvoid_pack_element T4, typename ... Ts>
144147consteval auto prune_voids_pack (pack<Rs...> result, pack<T1, T2, T3, T4, Ts...>)
145148{
146149 return prune_voids_pack (pack<Rs..., T1, T2, T3, T4>{}, pack<Ts...>{});
147150}
148151
149152// 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>)
153+ template <typename ... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, nonvoid_pack_element T3, nonvoid_pack_element T4,
154+ nonvoid_pack_element T5, nonvoid_pack_element T6, nonvoid_pack_element T7, nonvoid_pack_element T8, typename ... Ts>
153155consteval auto prune_voids_pack (pack<Rs...> result, pack<T1, T2, T3, T4, T5, T6, T7, T8, Ts...>)
154156{
155157 return prune_voids_pack (pack<Rs..., T1, T2, T3, T4, T5, T6, T7, T8>{}, pack<Ts...>{});
0 commit comments