2016-11-19 3 views
0

Kann jemand mir bitte erklären, was genau in dem folgenden Code geschiehtWie werden diese Vorlagenargumente interpretiert und verwendet?

template <template <typename, typename...> class Holder, typename retType,typename... T> 
    class EventListener<Holder<retType(T...)>> 
    { 
     friend class Holder<retType(T...)>; 
     typedef Holder<retType(T...)> HolderType; 
     private: 
     HolderType* _Holder; 
    } 

Ich möchte nur wissen, wie das, was genau von Holder erwähnt, sowohl retType und T typenames. dann wie retType (T ...) definiert ...?

+0

'retType (T ...)' ist ein Funktionstyp, der 'retType' zurückgibt und eine Packung' T' nimmt. Zum Beispiel: 'int (bool, char, int)' oder 'void()' – 0x499602D2

Antwort

0

Das Template-Argument

template <typename, typename...> class Holder 

ist ein Template-Template-Argument. Dies bedeutet, dass das Template-Argument eine Klassenvorlage sein sollte, die über einen einzelnen Typ gefolgt von einer Liste von Template-Typ-Argumenten parametrisiert werden kann. wenn Sie eine Vorlage wie

template <typename, typename... Args> class ImAVariadicTemplate { 
    // ... 
}; 

hatte, konnte Sie die erste Vorlage Argument instanziiert zum Beispiel durch in ImAVariadicTemplate vorbei.

Das nächste Bit, retType(T...), bedeutet „den Typ einer Funktion, deren Rückgabetyp ist retType und deren Argumenttypen werden von der Liste der Typen im Parameter Pack T. Zum Beispiel gegeben angegeben, wenn retTypeint und T ist die Liste double, float, short, dann erweitert dies auf den Typ int(double, float, short), die Art einer Funktion in einem double, einem float, und einem short nehmen und eine int zurückgeben. (Die Syntax hier kann ziemlich verwirrend sein, da es aussieht wie du bist Aufruf einer Funktion namens retType, wenn Sie wirklich über eine Art von Funktion sprechen.)

Setzt man diese zusammen, um die Syntax

Holder<retType(T...)> 

bedeutet „instanziiert die Holder Vorlage als Typ mit dem Typ einer Funktion, die in einer Reihe von Argumenten, deren Typ nimmt durch die Liste der Typen in T gegeben ist und gibt eine retType zurück. "Rollen von der Zunge. :-)

Verwandte Themen