2012-12-18 6 views
5

durante il gioco e cercando di calcolare la dimensione totale del vettore ho provato qualcosa di similePosso usare value_type su un'istanza del vettore, non sul suo tipo

vector<double> vd; 
auto area = vd.size()* sizeof (vd::value_type); 
//Ive seen Stepanov use area as name for this kind of size, idk if he adds the sizeof vd also to area :) 

Purtroppo questo non funziona ... ho bisogno di utilizzare vector<double>::value_type ma ciò rende il codice meno leggibile. Può essere fatto funzionare? Non mi piace sizeof vd.front() perché sembra brutto scrivere front() per questo.
EDIT: decltype varianti anche in forma in quella che chiamerei brutto categoria ...

+1

argomento di sizeof non viene valutato nel modo in cui si suggerisce - pensate in questo modo: compilatore guarda a ciò che 'vd.front 'restituisce e applica sizeof a quel tipo, non vi è alcuna chiamata di funzione che si verifica qui. – Fiktik

+0

leggi quello che ho detto ... so che la dimensione è il tempo di compilazione ... solo .front() è brutto perché non segnala l'intento ... potrebbe essere .back() [.size() - 1]. .. – NoSenseEtAl

+0

mi scuso per la parolaccia ... sostituito "call" con "write" è facile scrivere una cosa mentre si pensa qualcos'altro ...:/ – NoSenseEtAl

risposta

7

io penso decltype può essere utilizzato:

auto area = vd.size() * sizeof(decltype(vd)::value_type); 

come si utilizza auto presumo C++ 11 è consentito.

Confermato con g ++ v4.7.2 e clang v3.3.

+0

Funziona perfettamente. Nota per eclissare gli utenti CDT: il codice è sottolineato (avviso). È un falso positivo segnalato. (compilare OK però) –

1

In C++ 11, è possibile utilizzare decltype(vd[0]):

auto area = vd.size()* sizeof (decltype(vd[0])); 

Ma nel particolare scenario, si può solo scrivere questo:

auto area = vd.size()* sizeof (vd[0]); 

Dal momento che l'espressione contenuta sizeof (e decltype troppo) non saranno valutati, entrambi funzioneranno anche se vd è vuoto.

+2

si potrebbe anche solo perdere il decltype ... – Fiktik

+0

@Fiktik: stavo scrivendo anche quello. – Nawaz

+1

Questo è praticamente lo stesso di 'sizeof vd.front()' menzionato nella domanda. – interjay

4

Che ne dici di una semplice funzione di supporto?

template <typename Container> 
size_t value_size(const Container &) 
{ 
    return sizeof(typename Container::value_type); 
} 

[...] 

vector<double> vd; 
auto area = vd.size() * value_size(vd); 

Si potrebbe anche sovraccaricare la funzione in modo che funzioni con altri contenitori come array (naturalmente, si avrebbe bisogno di avvolgere size pure).

Idealmente, l'intero calcolo potrebbe essere avvolto in una funzione generica:

template <typename Container> 
size_t area(const Container &c) 
{ 
    return c.size() * sizeof(typename Container::value_type); 
} 

//possible overload for arrays (not sure it's the best implementation) 
template <typename T, size_t N> 
size_t area(const T (&arr)[N]) 
{ 
    return sizeof(arr); 
} 

[...] 

std::vector<double> vd; 
auto vd_area = area(vd); 
double arr[] = { 1., 2. }; 
auto arr_area = area(arr); 
+0

+1 Abbastanza sicuro che deve essere 'sizeof (typename Container :: value_type);' – hmjd

+0

@hmjd: Grazie, risolto. –