2015-02-23 18 views
21

Theo tiêu chuẩn C++ 11, biểu thức lambda có thể sử dụng biến trong phạm vi bao quanh, bằng danh sách chụp, danh sách tham số hoặc cả hai.C++ Lambdas: danh sách chụp và danh sách tham số

Vì vậy, hãy xem xét hai phiên bản của cùng một mã.

1) Với chụp

int x = 4; 

cout << "With capture : Factorial of " << x << " = " << [x]() // <= Capture 
{ 
    int r = 1; 
    for (int i = x; i > 1; i--) r = r * i; 
    return r; 
}() << endl; 

2) Với tham số

int x = 4; 

cout << "With parameter: Factorial of " << x << " = " << [](int x) // <= Parameter 
{ 
    int r = 1; 
    for (int i = x; i > 1; i--) r = r * i; 
    return r; 
}(x) << endl; 

Đầu ra là:

With capture : Factorial of 4 = 24 
With parameter: Factorial of 4 = 24 

Kể từ khi chúng ta có thể vượt qua các thông số để lambdas trong danh sách tham số (chỉ như với bất kỳ hàm C++ nào), tại sao chúng ta cần danh sách chụp?

Ai đó có thể hiển thị cho tôi các trường hợp danh sách tham số không hoạt động và chỉ danh sách chụp không?

Trả lời

11

Ví dụ sử dụng các thuật toán STL:

std::vector<int> items; 
int factor; 
auto foundItem = std::find_if(items.begin(), items.end(), 
[&factor](int const& a) 
{ 
    return a * factor == 100; 
}); 

Trong trường hợp này bạn đang gọi trong lambda cho mỗi mục trong container và bạn quay trở lại nếu giá trị nhân với một yếu tố bắt là 100. Mã không có ý nghĩa gì nhiều, nó chỉ cho bạn thấy một ví dụ trong đó các danh sách chụp và tham số quan trọng.

+1

chúng ta không thể chuyển cả 'int' và 'factor' vào danh sách tham số và để trống không? –

+2

@ Xicod'Abrolha Làm thế nào? Bạn không gọi lambda, 'std :: find_if' đang thực hiện nó. Làm thế nào bạn sẽ làm cho nó gọi chức năng khác nhau? – Angew

+2

không có Xico, bạn không thể! trong mã find_if một nơi nào đó bạn có cái gì đó gọi lambda của bạn (hoặc chức năng) như thế này: xử lý (giá trị); cho mỗi giá trị trong phạm vi bắt đầu/kết thúc. –

3

Vấn đề là khi chụp, bạn có thể giữ trạng thái (giống như một lớp viết tay với toán tử()) trong một đối tượng giống như hàm. @dau_sama cho một câu trả lời hay. Dưới đây là một ví dụ khác:

#include <iostream> 
using namespace std; 

int main() { 

    const auto addSome = [](double some){ 
    return [some](double val){ return some+val; } ; 
    }; 

    const auto addFive = addSome(5); 

    std::cout << addFive(2) << std::endl; 
} 
Các vấn đề liên quan