หนึ่งจะเรียก std :: ส่งต่ออาร์กิวเมนต์ทั้งหมดในฟังก์ชันตัวแปรได้อย่างไร


115

ฉันแค่เขียนโรงงานออบเจ็กต์ทั่วไปและใช้เมตาไลบรารีของตัวประมวลผลก่อนเร่งความเร็วเพื่อสร้างเทมเพลตแบบต่างๆ (ใช้ 2010 และไม่รองรับ) ฟังก์ชันของฉันใช้การอ้างอิง rval และstd::forwardเพื่อทำการส่งต่อที่สมบูรณ์แบบและทำให้ฉันคิดว่า ... เมื่อ C ++ 0X ออกมาและฉันมีคอมไพเลอร์มาตรฐานฉันจะทำสิ่งนี้กับเทมเพลตตัวแปรจริง ฉันจะเรียกร้องstd::forwardให้มีการโต้แย้งได้อย่างไร?

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

วิธีเดียวที่ฉันคิดได้ว่าจะต้องมีการเปิดกล่อง ... params ด้วยตนเองและฉันก็ยังไม่ค่อยอยู่ที่นั่นเช่นกัน มีไวยากรณ์ที่เร็วกว่าที่จะใช้งานได้หรือไม่?

คำตอบ:


162

คุณจะทำ:

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

คำ...พูดที่ค่อนข้างจะบอกว่า "นำสิ่งที่อยู่ทางซ้ายและสำหรับพารามิเตอร์เทมเพลตแต่ละรายการให้แกะกล่องตามนั้น"


1
เพิ่มเติมว่าควรส่งผ่านพารามิเตอร์อย่างไร ฉันคิดว่าแบบฝึกหัดแสดงvoid f(Params&& ...params)
UncleBens

87
ในการพูดคุยเหมือนวันโจรสลัดที่ฉันใช้void f(Ar&& ...arg)
woolstar

กรุณาอธิบายแรงจูงใจในการเลือกใช้การอ้างอิง rvalue && (แทนที่จะเป็น & อ้างอิงหรือตามมูลค่าขึ้นอยู่กับสถานการณ์)
DavidJ

@DavidJ ฉันใช้แรงจูงใจในการถามคำถาม ดูอย่างไรก็ตาม: stackoverflow.com/questions/3582001/vantages-of-using-forward
GManNickG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.