2012-08-10 18 views
12

Tôi có một hàm thành viên với một số biến tham số, được lưu trữ trong std::function và tôi muốn ràng buộc cá thể và nhận đối tượng hàm độc lập.chức năng thành viên liên kết trong một thời trang variadic

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    std::function<R(Args...)> = /* bind the instance c into the function? */ 
} 

// ... 

Class c; 
connect(c, &Class::foo); 

Đối với một số cố định của các đối số tôi muốn sử dụng std::bind, nhưng tôi không thấy làm thế nào để làm điều này cho thông số variadic.

+0

Làm thế nào chính xác để bạn có được 'args ... '? – Xeo

+0

Được rồi, tôi đã viết mã một cách khác nhau, hy vọng nó dễ hiểu hơn theo cách này. –

+0

Vâng, đúng thế. Và làm cho giải pháp khá dễ dàng. :) – Xeo

Trả lời

15

Giải pháp là rất đơn giản, vì bạn đã có số lượng đối số và tất cả mọi thứ:

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    // or capture 't' by-value 
    std::function<R(Args...)> fun = [&t,f](Args... args){ f(t,args...); }; 
    // ... 
} 

Live example.

+0

Điều này sẽ thêm một lớp bổ sung vào ngăn xếp cuộc gọi, tức là tôi phải thêm một số phép thuật 'std :: forward' để không có tác dụng phụ, phải không? –

+4

@lucas: Ngay cả ma thuật chuyển tiếp hoàn hảo thông minh cũng sẽ không thực hiện cuộc gọi thông qua 'std :: function' biến mất. ;) – Xeo

+0

: P Nhưng sẽ không sao chép nội dung nào nhiều hơn mức cần thiết. –

Các vấn đề liên quan