2012-03-21 8 views
6

Mi sono imbattuto in questo codice e mi chiedevo cosa significasse. Ma anche dopo circa 15 minuti di guardarlo non ha senso per me.Tipo typedf non chiaro

template< typename T > 
struct Vector4 { 
    typedef T Vector4<T>::* const vec[4]; 
    static const vec constVec; 

    //just to have some member instances of T 
    T member1, member2, member3, member4; 
}; 

Quindi qual è il tipo di constVec? Si prega di non ripetere semplicemente il typedef ma di spiegare nel linguaggio comune.

Le mie note finora:

  • Perché ci sono due tipi (T e Vector4<T>), questo è un puntatore a funzione?
  • Cosa significa :: *? Prendi tutto dalla portata di Vector4?
  • È un array di puntatori const? Ma perché il :: allora?
+3

http://www.gamedev.net/topic/261920-a-slick-trick-in-c/ –

+0

@EddyPronk:. Bello sapere dove quelle persone ottengono quella da ^^ Anche se la mia fonte non proveniva da lì (ma apparentemente fortemente ispirata) – Nobody

risposta

10

constVec è un array di 4 puntatori costanti ai membri della classe Vector4<T> che sono di tipo T

Nota: I membri non sono costanti, i puntatori stessi sono.

In primo luogo, poiché questi sono puntatori costanti, è necessario inizializzarli nel costruttore: (Ho appena notato il qualificatore static, quindi deve essere inizializzato al di fuori della classe, ma se non fosse statico, si 'd bisogno di farlo nella lista di inizializzazione)

template< typename T > 
struct Vector4 { 
    typedef T Vector4<T>::* const vec[4]; 
    static const vec constVec; 

    //just to have some member instances of T 
    T member1, member2, member3, member4; 

}; 

template<typename T> 
const typename Vector4<T>::vec Vector4<T>::constVec = {&Vector4::member1,&Vector4::member2,&Vector4::member3,&Vector4::member4}; 

int main() { 
    Vector4<int> v; 
    for(int i=0; i<4; i++) { 
     (v.*Vector4<int>::constVec[i]) = 5; 
    } 
return 0; 
} 
+0

ho aggiunto un membro di tipo T alla mia domanda. Ti dispiacerebbe aggiungere del codice, che mostra l'uso di 'vec' insieme al membro? – Nobody

+0

Quindi, la morale dell'esempio è che puoi scorrere i membri. – enobayram

+0

+1 Molto bello. Grazie per la spiegazione e l'esempio. – Nobody

Problemi correlati