@@ -283,29 +283,30 @@ namespace xt
283
283
* apply implementation *
284
284
************************/
285
285
286
- namespace detail
287
- {
288
- template <class R , class F , std::size_t I, class ... S>
289
- R apply_one (F&& func, const std::tuple<S...>& s) NOEXCEPT(noexcept (func(std::get<I>(s))))
290
- {
291
- return static_cast <R>(func (std::get<I>(s)));
292
- }
293
-
294
- template <class R , class F , std::size_t ... I, class ... S>
295
- R apply (std::size_t index, F&& func, std::index_sequence<I...> /* seq*/ , const std::tuple<S...>& s)
296
- NOEXCEPT(noexcept (func(std::get<0 >(s))))
297
- {
298
- using FT = std::add_pointer_t <R (F&&, const std::tuple<S...>&)>;
299
- static const std::array<FT, sizeof ...(I)> ar = {{&apply_one<R, F, I, S...>...}};
300
- return ar[index ](std::forward<F>(func), s);
301
- }
302
- }
303
-
304
286
template <class R , class F , class ... S>
305
287
inline R apply (std::size_t index, F&& func, const std::tuple<S...>& s)
306
288
NOEXCEPT(noexcept (func(std::get<0 >(s))))
307
289
{
308
- return detail::apply<R>(index , std::forward<F>(func), std::make_index_sequence<sizeof ...(S)>(), s);
290
+ XTENSOR_ASSERT (sizeof ...(S) > index );
291
+ return std::apply (
292
+ [&](const S&... args) -> R
293
+ {
294
+ auto f_impl = [&](auto && self, auto && i, auto && h, auto &&... t) -> R
295
+ {
296
+ if (i == index )
297
+ {
298
+ return static_cast <R>(func (h));
299
+ }
300
+ if constexpr (sizeof ...(t) > 0 )
301
+ {
302
+ return self (self, std::size_t {i + 1 }, t...);
303
+ }
304
+ return R{};
305
+ };
306
+ return f_impl (f_impl, std::size_t {0 }, args...);
307
+ },
308
+ s
309
+ );
309
310
}
310
311
311
312
/* **************************
0 commit comments