Como obter o número de elementos em std :: array <T, N> sem precisar criar sua instância?


9

Existe std::array<T, N>::size(), mas não é estático, por isso requer uma instância de std::array. Existe uma maneira de obter o valor que ele retorna (que é o Nde std::array<T, N>) sem ter que construir uma instância da matriz? Para uma matriz normal, eu poderia ter usado sizeof, mas não vejo garantia de que isso sizeof(std::array<T, N>) == N * sizeof(T)seja verdade.


Se você possui N, por que precisa pedir arraypara reproduzi-lo para você?
ShadowRanger 13/03

@ShadowRanger Porque sizeof(std::array<T, N>) == N * sizeof(T)não precisa ser verdade.
NathanOliver 13/03

Como a matriz pode ser digitada em outro local ou passada como argumento para um modelo.
dragonroot

11
Se você quiser saber o número de elementos, basta usar N.
JohnFilleau 13/03

11
@dragonroot Qual é o sentido de tudo isso? Se você já tem Nque começar, não há necessidade de passar por tudo isso para obter Nindiretamente ou validar isso N==N. Qual é o caso de uso real que você está tentando resolver?
Remy Lebeau

Respostas:


14

Está aí std::tuple_size<std::array>.

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

Plain std :: size () não faria?
Jesper Juhl 13/03

2
@JesperJuhl Na verdade não, std::size()requer uma instância da matriz.
0x499602D2 13/03

11
No entanto, não faz sentido usá- tuple_sizelo assim, se você já conhece o tamanho da matriz antecipadamente para passá-lo ao modelo. Talvez este seja um exemplo mais significativo? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau

@RemyLebeau Eu acho que o O / P está pensando que o declínio da matriz foi passado como um argumento de modelo para uma função de modelo? Mesmo assim, o único objetivo que posso ver é atribuí-lo como o objeto retornado, o que ainda exige que uma instância seja criada.
Gem Taylor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.