2011-08-24 28 views
18

Đoạn mã này thất bại trong việc biên dịch và tôi không biết nếu đó là vì nó không thể được thực hiện, lambdas không kế thừa từ binary_function, hay nó chỉ là rằng tôi nhận được cú pháp saiCó thể sử dụng currying với các hàm lambda không?

#include <functional> 

int main(int argc, const char *argv[]) 
{ 
    auto lambda = [](int x, int y) -> int { return x + y; }; 
    auto sumFive = std::bind1st(lambda, 5); 

    return 0; 
} 

Trả lời

23

Sử dụng:

auto sumFive = std::bind(lambda, 5, std::placeholders::_1); 

Hãy quên hoàn toàn về bind1stbinary_function vv Đó là những nạng trong C++ cũ vì thiếu lambdas và các mẫu variadic. Trong C++ 11, hãy sử dụng std::functionstd::bind.

+0

Chỉnh sửa nhỏ: lambdas không liên quan gì đến việc triển khai các mẫu 'std :: bind' và' 'std :: function'' - và variadic giúp dễ dàng/làm việc cho một số lượng tham số vô hạn. – ltjax

+0

@Itjax: Vâng, cảm ơn. Tôi đã gộp một vài thứ lại với nhau ở đó. Thực tế là, trong C++ 11 bạn có thể tự do ràng buộc bất cứ điều gì, và đặc biệt là lambdas. Điều khác tôi đoán là 'std :: function' là cần thiết như là một loại người nhận cho lambdas, có loại thực tế không được biết đến. –

+0

Rất lạ khi có loại không thể đặt tên. – Omnifarious

8

std::bind1ststd::bind là dự phòng trong C++ 11. Chỉ cần sử dụng một lambda:

auto lambda = [](int x, int y) { return x + y; }; 
auto sumFive = [&](int y) { return lambda(5, y); }; 

Đây là rõ ràng và đơn giản (không cần phải biết những gì std::bind làm hoặc những gì std::placeholders là dành cho), linh hoạt hơn (nó có thể hỗ trợ bất kỳ biểu hiện, không chỉ tham số ràng buộc), không đòi hỏi hỗ trợ tiêu đề, và có lẽ sẽ biên dịch nhanh hơn một chút.

+1

Vâng, nó hoạt động, nhưng giải pháp này hoàn toàn chống lại mô hình lập trình chức năng. – Cartesius00

+0

@ Cartesius00 tại sao lại như vậy? –

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