2011-11-24 12 views
12

ho trovato il seguente modello su un blog:metafunction di dimensione array - è in boost da qualche parte?

template <typename T, size_t N> 
struct array_info<T[N]> 
{ 
    typedef T type; 
    enum { size = N }; 
}; 

Si tratta di un elegante alternativa al sizeof(a)/sizeof(a[0]).

Un costrutto comunemente utilizzato per ottenere le dimensioni di un array deve essere sicuramente da qualche parte in una libreria. Non ne sono a conoscenza. Qualcuno può dirmi che questa funzionalità è nelle librerie standard da qualche parte e/o in Boost? Preferibilmente in una forma facile da usare e leggera.

+0

C'è la funzione standard '_countof' (è necessaria la sua versione di modello), ma al momento non riesco a trovare l'intestazione appropriata. – Vlad

+1

Usa invece std :: array. –

risposta

24

alla fine ho trovato me stesso la risposta - boost::size() :

#include <boost/range.hpp> 

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

Nel nuovo standard C++, std :: array dall'intestazione ha il metodo size(), che restituisce un constexpr ed è quindi disponibile in fase di compilazione.

si dovrebbe essere in grado di a qualcosa come

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

Spero che questo aiuti ...

+0

+1 Infatti: se vuoi una soluzione nello "spirito del C++", usa 'std :: array'. –

1

Se possibile, vorrei anche consigliare std::array o boost::array se possibile. Detto questo, è anche possibile utilizzare boost::extent per ottenere le dimensioni dell'array e boost::remove_all_extents per ottenere il tipo effettivo.

In C++ 11, i caratteri del tipo sono disponibili anche nella libreria standard.

Edit: Se cercate una funzione che opera su variabili, invece di tipi, provare le seguenti

template <typename T, std::size_t N> 
std::size_t array_count(const T(&) [N]) { return N; } 

vedere un esempio di utilizzo a http://ideone.com/IOdfp

+0

'boost :: extent' sembra funzionare sui tipi, non sugli oggetti. Ho bisogno di qualcosa che funzioni su un oggetto array, ad es. 'v' in' char * v [] = {/*...*/} ' – paperjam

+0

@paperjam. Ho capito male quello che volevi. Vedi il mio aggiornamento. –

Problemi correlati