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.