2010-03-17 21 views
6

¿Cómo se puede entender que lo que se declara aquí: (esto es tomado de otro mensaje el this forum)Extraña declaración (plantillas). C++

template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1]; 

Así es como leí:

plantilla de la función estática f llamada con (ChT<int Fallback::*, &C::x>*), pero entonces no puede tener sentido ¿por qué hay un operador de dirección y por qué hay una matriz?

Todavía estoy aprendiendo cómo entender las declaraciones de C++, así que explíquelo lenta y cuidadosamente.

+0

¿por qué haces esto? – Axarydax

+0

@Axarydax haciendo qué? –

+0

Creo que veo de dónde sacó eso de xD –

Respuesta

3

Es importante ver el tipo de devolución. Por lo tanto, el tipo de retorno de esta función es la referencia a char[1]; Imagine que f vuelve algo así como referencia a la siguiente:

char ret[1]; 

Por ejemplo

template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1] 
{ 

    static char xx[1] = {'F'}; 
    return xx; 
} 
7

El uso de algunos typedefs:

typedef char (&arrayref_t)[1]; 

Esta es una referencia a un array de caracteres. La matriz tiene un elemento.

typedef ChT<int Fallback::*, &C::x> tmpl_t; 

Esta es una clase de plantilla, instanciado con el tipo de "puntero a un int miembro de la clase Fallback", y un puntero miembro para x en clase C.

static arrayref_t f(tmpl_t*); 

La función ahora toma un puntero a una tmpl_t y devuelve un arrayref_t.

+0

Acabo de observar algo MUY interesante (sí, todavía lo estoy comiendo). Cuando diga "Esto es ... y un miembro apunta a x en la clase C", se debe mencionar que este puntero miembro en la clase C es en realidad miembro de la clase Reincidencia debido a la declaración de la clase ChT. Entonces, de hecho, están conectados entre sí. –