2011-11-24 14 views
12

me encontré con la siguiente plantilla en un blog:Metafunción de tamaño de matriz: ¿está aumentando en alguna parte?

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

+0

Existe la función estándar '_countof' (necesita su versión de plantilla), pero no puedo encontrar el encabezado apropiado en este momento. – Vlad

+1

Use std :: array en su lugar. –

Respuesta

24

finalmente encontré la respuesta a mí mismo - boost::size() :

#include <boost/range.hpp> 

int array[10]; 
boost::size(array); // returns 10 
5

En el nuevo estándar 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.

Usted debe ser capaz de algo así como

std::array< YourType, N > arr; 
constexpr auto totalSize = arr.size() * sizeof(std::array< YourType, N >::value_type); 

Espero que esto ayude ...

+0

+1 De hecho: si quiere una solución en el "espíritu de C++", use 'std :: array'. –

1

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, y boost::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 lo que buscas es una función que opera sobre las 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; } 

ver un ejemplo de su uso en http://ideone.com/IOdfp

+0

'boost :: extent' parece funcionar en tipos, no en objetos. Necesito algo que funcione en un objeto de matriz, p. 'v' en' char * v [] = {/*...*/} ' – paperjam

+0

@paperjam. No entendí lo que querías. Ver mi actualización –

Cuestiones relacionadas