Làm thế nào để gọi std :: forward trên tất cả các đối số trong một hàm variadic?


114

Tôi chỉ đang viết một nhà máy sản xuất đối tượng chung và sử dụng siêu thư viện tiền xử lý tăng cường để tạo một mẫu đa dạng (sử dụng năm 2010 và nó không hỗ trợ chúng). Hàm của tôi sử dụng tham chiếu rval và std::forwardđể thực hiện chuyển tiếp hoàn hảo và nó khiến tôi phải suy nghĩ ... khi C ++ 0X ra mắt và tôi có một trình biên dịch tiêu chuẩn, tôi sẽ thực hiện việc này với các mẫu biến thể thực. Làm thế nào, tôi sẽ gọi std::forwardcác đối số?

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

Cách duy nhất tôi có thể nghĩ là yêu cầu giải nén thủ công ... params và tôi cũng chưa hoàn thành. Có một cú pháp nhanh hơn sẽ hoạt động không?

Câu trả lời:


161

Bạn sẽ làm:

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

Các ...khá nhiều "tham những gì ở bên trái, và cho mỗi mẫu tham số, giải nén nó cho phù hợp."


1
Thêm vào đó là cách các tham số sẽ được truyền. Tôi nghĩ rằng hướng dẫn hiển thịvoid f(Params&& ...params)
UncleBens

87
Nói chuyện như một ngày cướp biển tôi sử dụngvoid f(Ar&& ...arg)
lenstar

Vui lòng giải thích động cơ của việc lựa chọn tham chiếu giá trị && (thay vì & tham chiếu hoặc chỉ theo giá trị tùy thuộc vào tình huống)
DavidJ Ngày

@DavidJ Tôi đã lấy động lực như nướng vào câu hỏi. Tuy nhiên, hãy xem: stackoverflow.com/questions/3582001/
domains
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.