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 ..., ...)>`
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 ..., ...)>`
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 R
double
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.
Vielen Dank. Das will ich wissen. –
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).
unterscheidet Ich verstehe nicht, warum es für diesen Zweck eine Zwei-Argument-Zerfall sein würde. – Yakk
'Vorlage
@KerrekSB: Ich kann nicht ganz verstehen, was Sie gesagt haben, können Sie bitte mehr erklären? –
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
@Yakk: Dieser Code stammt von boost :: hana. –
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