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.

dragonroot
la source
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);
0x499602D2
la source
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