Wie würde man std :: forward für alle Argumente in einer variadischen Funktion aufrufen?


114

Ich habe gerade eine generische Objektfabrik geschrieben und die Boost-Präprozessor-Metabibliothek verwendet, um eine variable Vorlage zu erstellen (mit 2010 und ohne Unterstützung). Meine Funktion verwendet rval-Referenzen und std::forwardfür eine perfekte Weiterleitung, und es hat mich zum Nachdenken gebracht ... Wenn C ++ 0X herauskommt und ich einen Standard-Compiler habe, würde ich dies mit echten variadischen Vorlagen tun. Wie aber würde ich std::forwardauf die Argumente zurückgreifen?

template <typename ...Params>
void f(Params... params) // how do I say these are rvalue reference?
{
    y(std::forward(...params)); //? - I doubt this would work.
}

Die einzige Möglichkeit, die ich mir vorstellen kann, würde das manuelle Auspacken von ... Parametern erfordern, und ich bin auch noch nicht ganz da. Gibt es eine schnellere Syntax, die funktionieren würde?

Antworten:


160

Du würdest:

template <typename ...Params>
void f(Params&&... params)
{
    y(std::forward<Params>(params)...);
}

Das ...sagt so ziemlich "Nimm, was links ist, und entpacke es für jeden Vorlagenparameter entsprechend."


1
Fügen Sie hinzu, wie die Parameter übergeben werden sollen. Ich denke, Tutorials zeigenvoid f(Params&& ...params)
UncleBens

87
Beim Reden wie ein Piratentag benutze ichvoid f(Ar&& ...arg)
Woolstar

Bitte erläutern Sie die Motivation für die Wahl der Wertreferenz && (anstelle von & Referenz oder nur nach Wert, je nach Situation)
DavidJ

@ DavidJ Ich habe die Motivation als in die Frage eingebrannt genommen. Siehe jedoch: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.