Trong C++ 11, làm thế nào để bạn khai báo một hàm nhận dạng biểu thức lambda làm đối số? Tôi có thể tìm thấy nhiều tài nguyên trực tuyến để khai báo lambdas hoặc lấy chúng làm tham số mẫu, nhưng những gì tôi thực sự muốn làm là có thể sử dụng lambdas như trình xử lý gọi lại dễ khai báo, tương tự như những gì có thể thực hiện bằng cách đóng trong JavaScript và các khối mã trong Objective-C.Tham số/loại lưu trữ cho C++ 11 lambda
Về cơ bản, C cổ điển ++ xây dựng Tôi muốn thay thế bằng một lambda là một cái gì đó như:
class MyCallback {
public:
virtual ~MyCallback() {}
virtual void operator(int arg) = 0;
};
void registerCallback(const std::shared_ptr<MyCallback> &);
void foo(void) {
int a, b, c;
class LocalCallback: public MyCallback {
int a, b, c;
public:
LocalCallback(int a, int b, int c): a(a), b(b), c(c) {}
void operator(int arg) { std::cout << (a+b+c)*arg << std::endl; }
};
registerCallback(std::shared_ptr<MyCallback>(new LocalCallback(a,b,c)));
}
đó sẽ được đơn giản hóa thành:
void registerCallback(/* WHAT GOES HERE? */);
void foo(void) {
int a, b, c;
registerCallback([=](int arg){std::cout << (a+b+c)*arg << std::endl; })
}
Vì vậy, những gì diễn ra nơi tôi đã viết /* WHAT GOES HERE? */
?
CHỈNH SỬA: Mục đích của việc lưu trữ một cuộc gọi lại để được gọi lại sau đó, thay vì được gọi ngay lập tức và được gọi.
Sử dụng các loại địa phương làm đối số mẫu không hợp pháp trong C++ 03. Một số trình biên dịch cho phép nó như là một phần mở rộng mặc dù. – bames53
Lợi thế của một lambda là nó làm cho việc viết lại callbacks dễ dàng hơn. Bạn không cụ thể viết mã sẽ được sử dụng với lambdas, bạn chỉ cần viết mã mà sẽ có một đối số 'function' và người gọi có thể sử dụng (hoặc không) một lambda như họ muốn. –
@ barnes53 Mã tôi đăng không sử dụng loại địa phương làm đối số mẫu. MyCallback là toàn cầu và loại địa phương đang được bao bọc trong tiêu chuẩn :: shared_ptr. Tôi sử dụng mô hình này tại nơi làm việc tất cả các thời gian, đó là lý do tại sao tôi quan tâm đến cách C++ 11 làm cho nó tốt hơn. :) –
fluffy