@@ -163,52 +163,37 @@ namespace xt
163163
164164 namespace detail
165165 {
166- template <std::size_t I, class F , class ... T>
167- inline typename std::enable_if<I == sizeof ...(T), void >::type
168- for_each_impl (F&& /* f*/ , std::tuple<T...>& /* t*/ ) noexcept
166+ template <class F , size_t ... I, class ... Ts>
167+ void for_each (F&& f, std::tuple<Ts...>& t, std::index_sequence<I...>) noexcept (
168+ (noexcept (f(std::get<I>(t))) && ...)
169+ )
169170 {
171+ (f (std::get<I>(t)), ...);
170172 }
171173
172- template <std::size_t I, class F , class ... T>
173- inline typename std::enable_if < I<sizeof ...(T), void >::type
174- for_each_impl (F&& f, std::tuple<T...>& t) noexcept (noexcept (f(std::get<I>(t))))
174+ template <class F , size_t ... I, class ... Ts>
175+ void for_each (F&& f, const std::tuple<Ts...>& t, std::index_sequence<I...>) noexcept (
176+ (noexcept (f(std::get<I>(t))) && ...)
177+ )
175178 {
176- f (std::get<I>(t));
177- for_each_impl<I + 1 , F, T...>(std::forward<F>(f), t);
179+ (f (std::get<I>(t)), ...);
178180 }
179181 }
180182
181- template <class F , class ... T >
182- inline void for_each (F&& f, std::tuple<T ...>& t) noexcept (
183- noexcept (detail::for_each_impl< 0 , F, T...> (std::forward<F>(f), t))
183+ template <class F , class ... Ts >
184+ inline void for_each (F&& f, std::tuple<Ts ...>& t) noexcept (
185+ noexcept (detail::for_each (std::forward<F>(f), t, std::make_index_sequence<sizeof...(Ts)>{} ))
184186 )
185187 {
186- detail::for_each_impl< 0 , F, T...> (std::forward<F>(f), t);
188+ detail::for_each (std::forward<F>(f), t, std::make_index_sequence< sizeof ...(Ts)>{} );
187189 }
188190
189- namespace detail
190- {
191- template <std::size_t I, class F , class ... T>
192- inline typename std::enable_if<I == sizeof ...(T), void >::type
193- for_each_impl (F&& /* f*/ , const std::tuple<T...>& /* t*/ ) noexcept
194- {
195- }
196-
197- template <std::size_t I, class F , class ... T>
198- inline typename std::enable_if < I<sizeof ...(T), void >::type
199- for_each_impl (F&& f, const std::tuple<T...>& t) noexcept (noexcept (f(std::get<I>(t))))
200- {
201- f (std::get<I>(t));
202- for_each_impl<I + 1 , F, T...>(std::forward<F>(f), t);
203- }
204- }
205-
206- template <class F , class ... T>
207- inline void for_each (F&& f, const std::tuple<T...>& t) noexcept (
208- noexcept (detail::for_each_impl<0 , F, T...>(std::forward<F>(f), t))
191+ template <class F , class ... Ts>
192+ inline void for_each (F&& f, const std::tuple<Ts...>& t) noexcept (
193+ noexcept (detail::for_each(std::forward<F>(f), t, std::make_index_sequence<sizeof...(Ts)>{}))
209194 )
210195 {
211- detail::for_each_impl< 0 , F, T...> (std::forward<F>(f), t);
196+ detail::for_each (std::forward<F>(f), t, std::make_index_sequence< sizeof ...(Ts)>{} );
212197 }
213198
214199 /* ****************************
0 commit comments