¿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.