2017-10-24 1 views
1

Könnten Sie mir bitte erklären, was diese Definition bedeutet? Ich sehe dies als überladene Template-Funktion von Struktur Aufgabe, die mit den Parametern für die Funktion aufruft args und wirft zurückgegebene Ergebnis zu T Typ.Wrapper für die Funktion als überladenen Operator

template <class T> 
struct Task 
{ 
    template <typename ...Args> 
    void operator()(const Args&... args) 
    { 
     (*static_cast<const T*>(this))(args...); 
    } 
}; 

Was kann daran liegen? Für mich sieht es sehr über-kombiniert aus.

+1

der Punkt, der so tut, ist hässlich, typ unsichere C++ Code zu implementieren, dass niemand in erster Linie das Schreiben sein sollte. Keine weitere Erklärung ist erforderlich. –

+2

'this' ist keine Funktion – Slava

+0

Ja, diese Adresse des Objekts, auf das die Member-Funktion aufgerufen wird. Aber das verwirrt mich noch mehr. – DzikiChrzan

Antwort

2

Dieser Code:

(*static_cast<const T*>(this))(args...); 

ist logisch äquivalent zu:

const T *ptr = static_cast<const T*>(this); 
const T &ref = *ptr; 
ref(args...); 

Ich denke, es ist jetzt klar sein sollte, was diese Aussage bedeutet (es wirft keinen Rückgabewert, der Funktionsaufruf, wie Sie denken)

+0

Jetzt ist es definitiv lesbarer. Also ruft 'operator()' den Zeiger auf das Objekt und dann durch Referenzaufrufe wieder überladen 'operator()'. Aber ist es nicht wiederkehrender Ruf von sich selbst? – DzikiChrzan

+0

mit dem statischen Typ 'T' anstelle von' Task', so sollte die Verwendung 'struct MyTask: Task {Vorlage void operator() sein (const Args &...); /*...*/}; ' – Jarod42

+1

Es erzeugt keinen Zeiger, es transformiert' this' nach 'const T *', also wird 'T' von' Task 'übernommen – Slava

Verwandte Themen