#pragma once #include #include #include #include namespace zip_with_details { template static inline constexpr decltype(auto) invoke_at(Func &&func, Ts &&...tuples) { return func(std::get(std::forward(tuples))...); } template static inline constexpr decltype(auto) make_tuple(Func &&func, std::index_sequence, Ts &&...tuples) { return std::make_tuple(invoke_at(std::forward(func), std::forward(tuples)...)...); } template static inline constexpr bool are_same_v = (std::is_same_v && ...); } // namespace zip_with_details template static constexpr decltype(auto) zip_with(Func &&func, Ts &&...tuples) { using namespace zip_with_details; static_assert(are_same_v...>); constexpr auto size = std::tuple_size_v< std::decay_t>>>; return make_tuple(std::forward(func), std::make_index_sequence{}, std::forward(tuples)...); }