2012-03-21 23 views
6

Encontré este código y me preguntaba qué significa. Pero incluso después de unos 15 minutos de mirarlo no tiene sentido para mí.Poco claro typedef tipo

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; 
}; 

Entonces, ¿cuál es el tipo de constVec? Por favor, no solo repita el typedef sino que explique en un lenguaje común.

Mis notas hasta ahora:

  • ¿Por qué hay dos tipos (T y Vector4<T>), se trata de un puntero de función?
  • ¿Qué significa :: * mean? ¿Tomar todo del alcance de Vector4?
  • ¿Es una matriz de punteros const? Pero ¿por qué el :: entonces?
+3

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

+0

@EddyPronk:. Es bueno saber donde esas personas lo entienden ^^ Aunque mi fuente no era de allí (pero aparentemente muy inspirada) – Nobody

Respuesta

10

constVec es una matriz de 4 punteros constantes a los miembros de la clase Vector4<T> que son de tipo T

Nota: Los miembros no son constantes, los propios punteros son.

En primer lugar, ya que estos son punteros constantes, debe inicializarlos en el constructor: (Acabo de ver el calificador static, por lo que debe inicializarse fuera de la clase, pero si no fuera estático, 'd necesidad de hacerlo en la lista de inicialización)

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

Agregué un miembro de tipo T a mi pregunta. ¿Te importaría agregar un código que muestre el uso de 'vec' junto con el miembro? – Nobody

+0

Entonces, la moraleja del ejemplo es que puede iterar a través de los miembros. – enobayram

+0

+1 Muy bonito. Gracias por la explicación y el ejemplo. – Nobody