2017-03-27 3 views
6
template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

Was ist die genaue Bedeutung davon? Ich brauche etwas Hilfe ~Was ist die Bedeutung von `Struct Decay <T, R (A ..., ...)>`

+1

Wo haben Sie diesen Code gesehen? Es sieht ähnlich aus wie jemand, der vernünftigerweise für die Implementierung von 'std :: decay' verwendet, aber es gibt keinen Grund für das' T' ... Meine erste Annahme ist, dass Sie es falsch kopiert haben. – Yakk

+0

@Yakk: Dieser Code stammt von boost :: hana. –

+1

Aha: http://www.boost.org/doc/libs/1_62_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1decay.html es ist eine Optimierung. Was das ansonsten unsinnige Design erklärt; Sie arbeiten an Ineffizienzen bei der Template-Instanziierung. – Yakk

Antwort

7
int foo(int); 
int bar(int, ...); 

Dies sind zwei verschiedene Funktionen. foo ist vom Typ int(int). bar ist vom Typ int(int,...).

... ist C-style varargs, nicht mit variadic template arguments zu verwechseln, die auch ... verwendet.

template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

Dieser Teil einer Implementierung einer optimierten Version von std::decay innerhalb boost::hana. Die typename T und T Teile sind rote Heringe, Teil dieser Optimierung.

Es ist eine Spezialisierung, die R(A..., ...) entspricht, wobei A... und R von einer Funktionssignatur abgeleitet werden.

Wenn Sie double(int, char, ...) als 2. Argument dieser hana::details::decay bestanden, würde Rdouble und A... würde int, char sein. Und die ... würde "die C-style Varags" entsprechen.

Dieser spezielle Spezialisierungszweck dient zum Zuordnen von Funktionssignaturen, die in C-artigen Varargs enden, zu Zeigern derselben Signatur. So bildet es double(int, char, ...) zu double(*)(int, char, ...) ab.

C-Varargs sind nicht identisch mit Templates. Sie sind älter als sie.

+0

Vielen Dank. Das will ich wissen. –

6

Diese Spezialisierung ist eine der Spezialisierungen, die den Zerfall eines Funktionstyps in den entsprechenden Zeiger-zu-Funktion-Typ umwandeln, der die Funktion von lvales widerspiegelt, um Zeiger prvalues ​​zu funktionieren.

Diese spezielle Spezialisierung wird für Funktionen mit variablen Argumenten verwendet (deren Parameterliste in einer Ellipse endet, damit sie Argumente akzeptiert, die keinen Parametern entsprechen).

+0

unterscheidet Ich verstehe nicht, warum es für diesen Zweck eine Zwei-Argument-Zerfall sein würde. – Yakk

+1

'Vorlage Strukturzerfall {mit Typ = R (*) (A ..., ...); }; 'ist eine Spezialisierung von' cause', die Funktionssignaturen eines bestimmten Typs abfängt. Ich verstehe nicht, warum du eine zweiargumentale Version von Verfall hast, dann ignoriere das erste Argument. – Yakk

+0

@KerrekSB: Ich kann nicht ganz verstehen, was Sie gesagt haben, können Sie bitte mehr erklären? –

Verwandte Themen