Bagaimana seseorang memanggil std :: forward pada semua argumen dalam fungsi variadic?

115

Saya baru saja menulis pabrik objek generik dan menggunakan pustaka meta preprocessor boost untuk membuat template variadic (menggunakan 2010 dan tidak mendukungnya). Fungsi saya menggunakan referensi rval dan std::forwardmelakukan penerusan sempurna dan itu membuat saya berpikir ... ketika C ++ 0X keluar dan saya memiliki kompiler standar, saya akan melakukan ini dengan template variadic nyata. Namun, bagaimana saya akan meminta std::forwardargumen?

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

Satu-satunya cara yang dapat saya pikirkan akan memerlukan pembongkaran manual dari ... params dan saya juga belum sampai di sana. Apakah ada sintaks yang lebih cepat yang akan berfungsi?

Edward Strange
sumber

Jawaban:

162

Anda akan melakukan:

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

The ...cukup banyak mengatakan "mengambil apa yang ada di sebelah kiri, dan untuk setiap parameter template, membongkar sesuai."

GManNickG
sumber
1
Tambahkan ke bagaimana parameter harus diteruskan. Saya pikir tutorial menunjukkanvoid f(Params&& ...params)
UncleBens
87
Tentang pembicaraan seperti hari bajak laut yang saya gunakanvoid f(Ar&& ...arg)
woolstar
Tolong jelaskan motivasi pilihan rvalue referensi && (bukan & referensi atau hanya dengan nilai tergantung situasi)
DavidJ
@DavidJ Saya telah mengambil motivasi seperti yang dimasukkan ke dalam pertanyaan. Namun lihat: stackoverflow.com/questions/3582001/manfaat-of-using-forward
GManNickG