¿Cómo obtener el número de elementos en std :: array <T, N> sin tener que crear su instancia?


9

La hay std::array<T, N>::size(), pero no es estática, por lo que requiere una instancia de std::array. ¿Hay alguna manera de obtener el valor que devuelve (que es el Nde std::array<T, N>) sin tener que construir una instancia de la matriz? Para una matriz normal, podría haberlo usado sizeof, pero no veo ninguna garantía de que sizeof(std::array<T, N>) == N * sizeof(T)sea ​​cierto.


Si es así N, ¿por qué necesita pedir arrayque se lo reproduzca?
ShadowRanger

@ShadowRanger Porque sizeof(std::array<T, N>) == N * sizeof(T)no tiene que ser cierto.
NathanOliver

Porque la matriz se puede escribir en otro lugar o pasar como argumento a una plantilla.
Dragonroot

1
Si desea saber la cantidad de elementos, simplemente use N.
JohnFilleau

1
@dragonroot ¿Cuál es el punto de todo esto, sin embargo? Si ya tiene Nque comenzar, no hay necesidad de pasar por todo esto para obtener Nindirectamente o validar eso N==N. ¿Cuál es el caso de uso real que estás tratando de resolver?
Remy Lebeau

Respuestas:


14

Hay std::tuple_size<std::array>.

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

¿No haría std :: size () simple ?
Jesper Juhl

2
@JesperJuhl En realidad no, std::size()requiere una instancia de la matriz.
0x499602D2

1
Sin embargo, no tiene sentido usarlo tuple_sizeasí, si ya conoce el tamaño de la matriz por adelantado para pasarlo a la plantilla. Tal vez este sería un ejemplo más significativo? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau

@RemyLebeau ¿Supongo que el O / P está pensando que la disminución de la matriz se ha pasado como un argumento de plantilla a una función de plantilla? Incluso entonces, el único propósito que puedo ver es asignarlo como el objeto devuelto, que todavía requiere que se cree una instancia.
Gema Taylor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.