2013-02-25 35 views
6

Không Boost Lambda/Phoenix hỗ trợ ra khỏi hộp một cái gì đó như lambda mà trả về lambda khác?Tăng Lambda/Phoenix - làm thế nào để làm lambda trả về lambda khác?

Ví dụ, có thể được sử dụng để làm một số loại tách lạng bộ:

std::cout << [](int x){return [=](int y){return x+y;};}(1)(2); 

Làm thế nào để đạt được mục đích tương tự với Boost Lambda/Phoenix (+ như một phần thưởng - chúng tôi sẽ nhận được hành vi đa hình)?

+0

Vấn đề tôi đã có trong cố gắng để trả lời này là 'arg1' được tiêu thụ bởi ngoài cùng' bind' - Tôi muốn một 'arg1' tôi có thể đi vào bên trong' bind', nhưng bên ngoài 'bind' ăn nó thay thế. Nếu tôi có một cách để "thoát" trình giữ chỗ đối số ... – Yakk

+0

@Yakk, bạn có thể thử sử dụng boost :: bind - AFAIK nó khác với liên kết lambda/phoenix (http://www.boost.org/doc/ libs/1_53_0/doc/html/lambda/s08.html # idp111396608). Ngoài ra, mã đăng của bạn cố gắng như câu trả lời - tiền thưởng kết thúc vào ngày mai ... – qble

Trả lời

5

Boost Phoenix Scope: let/lambda

Live demo:

#include <boost/phoenix.hpp> 
#include <iostream> 
#include <ostream> 

using namespace std; 
using namespace boost; 
using namespace phoenix; 
using namespace arg_names; 
using namespace local_names; 

int main() 
{ 
    // capture by reference: 
    cout << 
     (lambda(_a=_1)[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=_1)[lambda(_a=_1)[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
    // capture by value: 
    cout << 
     (lambda(_a=val(_1))[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=val(_1))[lambda(_a=val(_1))[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
} 

Output là:

3 
6 
3 
6 
+0

Đó là những gì tôi đang tìm kiếm, cảm ơn! – qble

+0

@EvgenyPanasyuk là có một cách dễ dàng để tạo ra một đánh giá lười biếng, như '[&]() -> void {fully_bound_expression_that_does_not_run_until_later; } '? – Yakk

+0

@Yakk, Bạn có thể mô tả chi tiết những gì bạn có ý nghĩa (có thể thông qua ví dụ đầy đủ với C++ 11 lambdas)? Bạn có nghĩa là http://liveworkspace.org/code/30jCv6$0? Hoặc có thể http://liveworkspace.org/code/2Kon3g$0? –

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