En cherchant comment générer une séquence de nombres entiers à partir de paramètres template selon des règles définies par moi-même, je suis tombé sur cette réponse de Jarod42 sur SO qui me dépasse un peu.

Je me suis permis de reproduire son exemple ci-dessous, traduit en C++17 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>>);
J'ai une question simple bien qu'un peu générale, certes : comment ça marche ? J'ai bien une vague idée de ce qu'il se passe mais j'aimerais saisir les détails. En particulier : que fait (Offset + Is2)... ?