2012-07-01 58 views
12

Tôi muốn gọi một phương thức của lớp học của tôi bên trong một biểu thức lambda:Gọi bên trong biểu thức lambda

void my_class::my_method(my_obj& obj) 
{ 
} 


void my_class::test_lambda() 
{ 
    std::list<my_obj> my_list; 

    std::for_each(my_list.begin(), my_list.end(), [](my_obj& obj) 
    { 
     // Here I want to call my_method: 
     // my_method(obj); 
    }); 
} 

Làm thế nào tôi có thể làm gì?

+0

chi tiết là cần thiết. Mã for_each ở đâu, trong một hàm thành viên khác của my_class? My_method là một hàm tĩnh hay không tĩnh? Nếu nó không tĩnh và 'for_each' không nằm trong hàm thành viên my_class, thì bạn muốn gọi hàm my_method nào? Nó có quan trọng không? – bames53

+0

for_each nằm bên trong một hàm thành viên không tĩnh khác của my_class. Tại sao downvote? – gliderkite

+0

vì câu hỏi không rõ ràng bằng văn bản. – bames53

Trả lời

25

Bạn cần phải nắm bắt this, hoặc rõ ràng hoặc ngầm:

std::for_each(l.begin(), l.end(), 
    [this](my_obj& o){ // or [=] or [&] 
     my_method(o); // can be called as if the lambda was a member 
    }); 
+0

giả sử rằng lambda đang được sử dụng từ một hàm thành viên của my_class. Câu hỏi không đủ cụ thể để biết đây có phải là trường hợp không. – bames53

+4

@bames: Tôi nghĩ đó là, nhận xét bên trong lambda chỉ ra rằng nó nên được gọi là 'my_method (o)', nhưng tôi có thể thấy bạn đang đến từ đâu. – Xeo

1

Bạn không thể gọi phương thức không tĩnh mà không cần đối tượng gọi nó.

Thực hiện một đối tượng my_class và chụp một tham chiếu đến nó trong lambda ...

my_class x; 

std::for_each(my_list.begin(), my_list.end(), [&x](my_obj& obj) 
//           ^^^^ 
{ 
    // Here I want to call my_method: 
    x.my_method(obj); 
}); 

Hoặc, nếu bạn có nghĩa là lambda là trong một phương pháp my_class sau đó chụp this. Hoặc, nếu đó là phương pháp tĩnh thì bạn có thể gọi my_class::my_method(obj) mà không cần chụp bất kỳ thứ gì, như bames53 đã nói bên dưới.

+0

và nếu nó là một phương pháp tĩnh thì bạn có thể gọi nó mà không có một cá thể: '[] (my_obj & obj) {my_class :: my_method (obj); } '. Câu hỏi không đủ cụ thể để chúng tôi biết liệu nó có tĩnh hay không. – bames53

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