2011-01-05 35 views
15

Tôi có một số hàm lambda mà tôi muốn liên kết bằng cách sử dụng hoặc là tăng :: bind hoặc std :: bind. (Đừng quan tâm cái nào, miễn là nó hoạt động.) Thật không may cả hai đều cho tôi những trình biên dịch khác nhau:Làm thế nào để sử dụng hàm lambda với boost :: bind/std :: bind trong VC++ 2010?

auto f = [](){ cout<<"f()"<<endl; }; 
auto f2 = [](int x){ cout<<"f2() x="<<x<<endl; }; 

std::bind(f)(); //ok 
std::bind(f2, 13)(); //error C2903: 'result' : symbol is neither a class template nor a function template 

boost::bind(f)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda0>' 
boost::bind(f2, 13)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda1>' 

Vì vậy, cách giải quyết đơn giản nhất cho điều này là gì?

+0

Tại sao bạn muốn sử dụng liên kết? Bạn không thể chỉ gọi f() hoặc f2 (1)? – Jagannath

+3

@Jagannath: Đây tất nhiên chỉ là một ví dụ đơn giản, nhưng trong thực tế tôi muốn lưu trữ kết quả liên kết vào một đối tượng hàm. – Timo

+0

Tại sao bạn muốn sử dụng liên kết? Tôi nghĩ C + + 0x cung cấp bao đóng? –

Trả lời

20

Bạn cần phải tự xác định kiểu trả về:

boost::bind<void>(f)(); 
boost::bind<int>(f2, 13)(); 

Bạn cũng có thể viết cho mình một mẫu chức năng để suy ra kiểu trả Automagically sử dụng Boost.FunctionTypes để kiểm tra điều hành của lambda của bạn(), nếu bạn don không muốn nói rõ ràng ràng buộc.

8
std::function<void()> f1 = [](){ std::cout<<"f1()"<<std::endl; }; 
std::function<void (int)> f2 = [](int x){ std::cout<<"f2() x="<<x<<std::endl; }; 
boost::function<void()> f3 = [](){ std::cout<<"f3()"<<std::endl; }; 
boost::function<void (int)> f4 = [](int x){ std::cout<<"f4() x="<<x<<std::endl; }; 

//do you still wanna bind? 
std::bind(f1)(); //ok 
std::bind(f2, 13)(); //ok 
std::bind(f3)(); //ok 
std::bind(f4, 13)(); //ok 

//do you still wanna bind? 
boost::bind(f1)(); //ok 
boost::bind(f2, 13)(); //ok 
boost::bind(f3)(); //ok 
boost::bind(f4, 13)(); //ok 
+0

Chỉ khi 'hàm' giới thiệu thời gian chạy-indirection và' bind' là nhanh hơn ... Có phải không? – Dario

+0

Tôi nghi ngờ việc gọi functor là kết quả từ việc ràng buộc sẽ nhanh hơn bao giờ hết vì kết quả ràng buộc thêm vào trong hầu hết các trường hợp nhưng lại là một mức độ khác. ràng buộc có thể sẽ được yêu cầu trong các tình huống mà một số thông số cần phải được ràng buộc. Trong ví dụ trên std :: bind (f2, 13)(); liên kết tham số đầu tiên với giá trị không đổi 13. Kết quả của liên kết là "functor" không có tham số và trả về void. – ds27680

+0

Gọi kết quả của 'bind' có thể nhanh hơn một chút, vì không có cuộc gọi nào thông qua chức năng ảo như với' hàm'. – ltjax

1

Tôi nghĩ bạn có thể quan tâm đến this MSDN forum post. Âm thanh như áp phích có cùng vấn đề với bạn và đã gây ra lỗi với MS Connect.

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