Comment obtenir le nombre d'éléments dans std :: array <T, N> sans avoir à créer son instance?


9

Il existe std::array<T, N>::size(), mais il n'est pas statique, il nécessite donc une instance de std::array. Existe-t-il un moyen d'obtenir la valeur qu'il renvoie (qui est la valeur Nde std::array<T, N>) sans avoir à construire une instance du tableau? Pour un tableau normal, j'aurais pu utiliser sizeof, mais je ne vois aucune garantie que ce sizeof(std::array<T, N>) == N * sizeof(T)soit vrai.


Si oui N, pourquoi devez-vous demander arrayà le reproduire pour vous?
— ShadowRanger

@ShadowRanger Parce que cela sizeof(std::array<T, N>) == N * sizeof(T)n'a pas à être vrai.
— NathanOliver

Parce que le tableau peut être typé ailleurs ou être passé en argument à un modèle.
— dragonroot

1
Si vous voulez connaître le nombre d'éléments, utilisez simplement N.
— JohnFilleau

1
@dragonroot Quel est l'intérêt de tout cela, cependant? Si vous devez déjà Ncommencer, il n'est pas nécessaire de passer par tout cela pour obtenir Nindirectement ou valider cela N==N. Quel est le cas d'utilisation réel que vous essayez de résoudre?
— Remy Lebeau

Réponses:


14

Voilà std::tuple_size<std::array>.

static_assert(std::tuple_size<std::array<int, 5>>::value == 5);

Plain std :: size () ne le ferait-il pas?
— Jesper Juhl

2
@JesperJuhl En fait non, std::size()nécessite une instance du tableau.
— 0x499602D2

1
Cela n'a pas de sens de l'utiliser tuple_sizecomme ça, si vous connaissez déjà la taille du tableau pour la passer dans le modèle. Ce serait peut-être un exemple plus significatif? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
— Remy Lebeau

@RemyLebeau Je suppose que l'O / P pense que le tableau array a été passé comme argument de modèle à une fonction de modèle? Même alors, le seul but que je peux voir est de l'assigner en tant qu'objet retourné, ce qui nécessite toujours la création d'une instance.
— Gem Taylor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.