1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <type_traits>
#include <utility>
namespace detail
{
template <typename Seq1, std::size_t Offset, typename Seq2> struct concat_seq;
template <std::size_t ...Is1, std::size_t Offset, std::size_t ...Is2>
struct concat_seq<std::index_sequence<Is1...> , Offset, std::index_sequence<Is2...> >
{
using type = std::index_sequence<Is1..., (Offset + Is2)...>;
};
}
template <std::size_t N, std::size_t E>
using gen_seq = typename detail::concat_seq<typename std::make_index_sequence<E>, E + 1, typename std::make_index_sequence<(N > E) ? (N - E - 1) : 0>>::type;
static_assert(std::is_same_v<std::index_sequence<0, 1, 3, 4>, gen_seq<5, 2>>);
static_assert(std::is_same_v<std::index_sequence< 1, 2 >, gen_seq<3, 0>>);
static_assert(std::is_same_v<std::index_sequence<0, 1, 2, 3 >, gen_seq<4, 4>>); |
Partager