2010-03-17 12 views
6

Wie kann ich verstehen, was hier erklärt: (diese aus einem anderen Beitrag auf this forum genommen wird)Seltsame Deklaration (Vorlagen). C++

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

Hier ist, wie ich lesen:

Vorlage der statischen Funktion f mit (ChT<int Fallback::*, &C::x>*) genannt, aber dann habe ich kann keinen Sinn machen, warum gibt es einen Adressoperator und warum gibt es ein Array?

Ich lerne immer noch, wie man C++ Deklarationen versteht, also bitte erklären Sie das langsam und sorgfältig.

+0

warum machst du das? – Axarydax

+0

@Axarydax macht was? –

+0

Ich denke, ich sehe, wo er das von xD bekommen –

Antwort

3

Es ist wichtig, den Rückgabetyp zu sehen. Der Rückgabetyp dieser Funktion bezieht sich also auf char[1]; Stellen Sie sich vor, dass f kehrt in den folgenden etwas wie Referenz:

char ret[1]; 

Zum Beispiel

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

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

einige typedefs Verwendung:

typedef char (&arrayref_t)[1]; 

Diese auf ein Array von Zeichen eine Referenz. Das Array hat ein Element.

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

Dies ist eine Template-Klasse, instanziiert mit dem Typ „Zeiger auf ein Mitglied der intFallback Klasse“, und ein Mitglied Zeiger auf x in Klasse C.

static arrayref_t f(tmpl_t*); 

Die Funktion nimmt nun einen Zeiger auf eine tmpl_t und gibt eine arrayref_t.

+0

Ich habe gerade sehr interessante Sache beobachtet (ja, ich mampfe es immer noch). Wo Sie sagen "Dies ist ..., und ein Mitglied Zeiger auf x in Klasse C", sollte erwähnt werden, dass dieser Mitglied Zeiger in Klasse C tatsächlich Mitglied der Klasse Fallback aufgrund der Deklaration der Klasse ChT ist. In der Tat sind sie miteinander verbunden. –