3 votes

Utilisation des arguments par défaut pour std::index_sequence

J'ai des difficultés à comprendre ce qui suit. Pourquoi ce code compile-t-il

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>())
{

    constexpr size_t values[] = {N_i...};
    return A<values[M_i]...>();
}

template <size_t N,size_t... N_i>
auto foo()
{
    return foo2<N,N_i...>(std::make_index_sequence<N>());
}

int main()
{
 foo<2, 1,2,3>();
}

mais pas celle-ci (où j'utilise l'argument par défaut de foo2 ):

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>())
{

    constexpr size_t values[] = {N_i...};
    return A<values[M_i]...>();
}

template <size_t N,size_t... N_i>
auto foo()
{
    return foo2<N,N_i...>();
}

int main()
{
 foo<2, 1,2,3>();
}

Merci d'avance.

4voto

Martin Bonner Points 91

Étant donné :

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>());

Vous ne pouvez pas spécifier explicitement M_i (parce que la séquence serait tout simplement engloutie dans le cadre de N_i ). Si vous spécifiez un argument, alors le compilateur peut utiliser la déduction d'argument de modèle pour déterminer ce que l'on doit faire. M_i est. Si vous Ne le fais pas. spécifier un argument, alors le compilateur n'a aucun moyen de déduire ce que les M_i (et il doit le savoir avant de commencer à décider que vous avez besoin d'un argument par défaut, et quel est cet argument).

En supposant qu'il s'agit d'une petite partie d'un tout plus grand, la solution est d'écrire

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...>)
{

    constexpr size_t values[] = {N_i...};
    return A<values[M_i]...>();
}

template <size_t N,size_t... N_i>
auto foo2()
{
    return foo2<N,N_i...>(std::make_index_sequence<N>());
}

Alors vous pouvez effectivement écrire :

template <size_t N,size_t... N_i>
auto foo()
{
    return foo2<N,N_i...>();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X