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

dragonroot
fuente
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);
0x499602D2
fuente
¿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