c++ - teoria - michael halliday
La metafunción del tamaño de la matriz: ¿está aumentando en alguna parte? (4)
Encontré la siguiente plantilla en un blog :
template <typename T, size_t N>
struct array_info<T[N]>
{
typedef T type;
enum { size = N };
};
Es una alternativa elegante a sizeof(a) / sizeof(a[0])
.
Una construcción comúnmente utilizada para obtener el tamaño de una matriz seguramente debería estar en algún lugar de una biblioteca. No estoy al tanto de uno. ¿Alguien puede decirme que esta funcionalidad está en las bibliotecas estándar en algún lugar y / o en Boost? Preferiblemente en una forma ligera y fácil de usar.
En el nuevo estándar de C ++, std :: array del encabezado tiene el método size (), que devuelve un constexpr y, por lo tanto, está disponible en tiempo de compilación.
Deberías ser capaz de hacer algo como
std::array< YourType, N > arr;
constexpr auto totalSize = arr.size() * sizeof( std::array< YourType, N >::value_type );
Espero que esto ayude...
Finalmente encontré la respuesta yo mismo - boost::size()
:
#include <boost/range.hpp>
int array[10];
boost::size(array); // returns 10
Si es posible, también recomendaría std::array
o boost::array
si es posible. Dicho esto, también puede usar boost :: extent para obtener los tamaños de matriz e impulsar :: remove_all_extents para obtener el tipo real.
En c ++ 11, los rasgos de tipo también están disponibles en la biblioteca estándar.
Editar: si busca una función que opere con variables, en lugar de tipos, intente lo siguiente
template <typename T, std::size_t N>
std::size_t array_count(const T(&) [N]) { return N; }
Vea un ejemplo de uso en http://ideone.com/IOdfp
Necesitas quizás el macro _countof
. Según http://www.cplusplus.com/forum/beginner/54241/ , está #definido en <cstdio>
. Pero no estoy seguro de si está disponible fuera de Visual C ++.
De todos modos, no es complicado crear un archivo de encabezado y poner su definición allí.
Actualizar:
_countof
es específico de Microsoft, pero hay una discusión sobre otros compiladores aquí: ¿ Equivalentes a la cuenta de MSVC en otros compiladores?