Come ottenere il numero di elementi in std :: array <T, N> senza dover creare la sua istanza?


9

C'è std::array<T, N>::size(), ma non è statico, quindi richiede un'istanza di std::array. C'è un modo per ottenere il valore che restituisce (che è il Nof std::array<T, N>) senza dover costruire un'istanza dell'array? Per un array normale, avrei potuto usare sizeof, ma non vedo alcuna garanzia che sizeof(std::array<T, N>) == N * sizeof(T)sia vera.


Se hai N, perché devi chiedere arraydi riprodurlo per te?
ShadowRanger

@ShadowRanger Perché sizeof(std::array<T, N>) == N * sizeof(T)non deve essere vero.
NathanOliver,

Perché l'array può essere dattilografato altrove o essere passato come argomento a un modello.
Dragonroot,

1
Se vuoi conoscere il numero di elementi, basta usare N.
JohnFilleau,

1
@dragonroot Qual è il punto di tutto questo, però? Se devi già Niniziare, non è necessario esaminare tutto questo per ottenere Nindirettamente o per convalidarlo N==N. Qual è il caso d'uso che stai cercando di risolvere?
Remy Lebeau,

Risposte:


14

C'è std::tuple_size<std::array>.

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

Non farebbe semplicemente std :: size () ?
Jesper Juhl,

2
@JesperJuhl In realtà no, std::size()richiede un'istanza dell'array.
0x499602D2

1
Non ha senso utilizzarlo in tuple_sizequesto modo, tuttavia, se si conosce già la dimensione dell'array in anticipo per passarlo nel modello. Forse questo sarebbe un esempio più significativo? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau,

@RemyLebeau Suppongo che l'O / P stia pensando che l'array decl sia stato passato come argomento template a una funzione template? Anche allora l'unico scopo che posso vedere è quello di assegnarlo come oggetto restituito, che richiede comunque la creazione di un'istanza.
Gem Taylor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.