2010-03-17 10 views
6

Come posso capire quanto dichiarato qui: (questo è preso da un altro post su this forum)Strange declaration (templates). C++

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

Ecco come ho letto:

modello di funzione statica f chiamato con (ChT<int Fallback::*, &C::x>*), ma poi ho non ha senso perché c'è un indirizzo di operatore e perché c'è un array?

Sto ancora imparando a capire le dichiarazioni C++, quindi spiegatelo lentamente e con attenzione.

+0

perché stai facendo questo? – Axarydax

+0

@Axarydax facendo cosa? –

+0

Penso di vedere dove l'ha preso da xD –

risposta

3

È importante vedere il tipo di reso. Quindi, il tipo di ritorno di questa funzione è riferimento a char[1]; Immaginate che f restituisce qualcosa di simile riferimento alla seguente:

char ret[1]; 

Per esempio

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

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

Utilizzando alcuni typedef:

typedef char (&arrayref_t)[1]; 

Questo è un riferimento ad un array di caratteri. L'array ha un elemento.

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

Questa è una classe template, istanziato con il tipo "puntatore ad un int membro della classe Fallback", e un puntatore membro per x in classe C.

static arrayref_t f(tmpl_t*); 

La funzione ora prende un puntatore ad una tmpl_t e restituisce un arrayref_t.

+0

Ho appena osservato una cosa MOLTO interessante (sì, lo sto ancora masticando). Dove stai dicendo "Questo è ..., e un puntatore a membro di x in classe C", va detto che questo puntatore membro in classe C è in realtà un membro della classe Fallback a causa della dichiarazione della classe ChT. Quindi in un fatto sono collegati tra loro. –