2011-11-11 30 views
14

thể trùng lặp:
Bind Vs Lambda?Là std :: bind vẫn hữu ích so với lambdas?

sử dụng của tôi về std::bind đã giảm xuống còn 0 bây giờ mà lambdas đã đạt được ủng hộ rộng rãi.

Có bất kỳ sự cố nào mà std::bind phù hợp duy nhất đối với chức năng lambda không?

Có lý do thuyết phục nào để giữ std::bind trong lambdas tiêu chuẩn khi đã thêm?

+3

Ràng buộc có thể vẫn còn __far__ ngắn gọn hơn lambdas nếu các loại đối số là dài. – ildjarn

+1

http://stackoverflow.com/questions/1930903/bind-vs-lambda/4581747#4581747 –

+1

Chúng vẫn là IMO khá trực giao. –

Trả lời

21

Bạn có thể chụp bằng giá trị hoặc tham khảo, và vấn đề là chụp theo giá trị thực sự có nghĩa là 'chụp bởi sao chép '. Đây là nút hiển thị cho loại di chuyển. Vì vậy, bạn không thể sử dụng một lambda phải làm như sau:

struct foo { void bar() {} }; 

std::unique_ptr<foo> f { new foo }; 
auto bound = std::bind(&foo::bar, std::move(f)); 
static_assert(std::is_move_constructible<decltype(bound)>::value, ""); 
bound(); 

IIRC ngắn gọn Ủy ban Tiêu chuẩn xem xét cho phép biểu hiện độc đoán bên trong một danh sách chụp lambda để giải quyết này (có thể trông giống như [std::move(f)] { return f.bar(); }), nhưng tôi không nghĩ rằng có một đề xuất vững chắc và C++ 11 đã chạy trễ.

Điều đó và hạn chế đối với hành vi đơn hình với lambdas là bộ phận giao dịch đối với tôi.

+1

Ví dụ hay! Liệu đối tượng 'bind' có phải sở hữu đối tượng' foo' động không? Bản thân nó có trở thành không thể sao chép được không? –

+0

@KerrekSB Tuyệt đối, trên cả hai tài khoản. –

+0

@Luc ví dụ tuyệt vời, tôi đã tìm kiếm chính xác điều này. Vấn đề còn lại của tôi là biểu thức ràng buộc đó không thể được gán cho std :: function . Nó có thể không có unique_ptr và di chuyển mặc dù. Có cách nào để vượt qua ràng buộc đó như một cuộc gọi lại đến một chức năng khác không? (Mục đích là cuộc gọi lại sở hữu đối tượng và xóa nó sau khi chính cuộc gọi lại bị hủy). –

4

bind là rất tốt cho việc tạo tham chiếu đến hàm thành viên bị ràng buộc:

Foo x; 
auto f = std::bind(&Foo::bar, &x, 12, true); 
register_callback(f); 

Edit: Như Lục Danton chứng minh, xây dựng này là rất linh hoạt và cho phép con trỏ Ví dụ để đi vào một loạt đáng ngạc nhiên của vỏ ngoài (ví dụ: con trỏ thông minh). [/]

Nếu khả thi, lambda có thể thích hợp hơn, đặc biệt vì nó cung cấp khả năng tối ưu hóa cao hơn, nhưng biểu thức ràng buộc vẫn có vị trí của chúng.

(Trong mọi trường hợp, auto được ưa chuộng hơn std::function cho các loại hình để lưu trữ các đối tượng có thể được gọi.)

+2

ràng buộc là tuyệt vời nhưng lambdas là tốt hơn. 'Auto f = [& x]() {return x.bar (12, true); }; 'khá ngắn gọn. Vì vậy, một lần nữa, khi nào 'std :: bind' được ưa thích? –

+0

@deft_code: Hmm ... 'bind' điền vào phần giữ chỗ ở cuối (' '' của tôi vẫn có thể lấy nhiều đối số), vì vậy có lẽ nó sạch hơn khi biểu thức ràng buộc là một phần của mẫu ở đâu đó. Nhưng đó là một câu hỏi hay! –

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