Как в C++11 объявить функцию, которая принимает лямбда-выражение в качестве аргумента? Я могу найти множество ресурсов в Интернете для объявления лямбда-выражений или использования их в качестве параметров шаблона, но что мне действительно хотелось бы сделать, так это иметь возможность использовать лямбда-выражения в качестве легко объявляемых обработчиков обратного вызова, подобных тому, что стало возможным благодаря замыканиям. в JavaScript и блоки кода в Objective-C.
По сути, классическая конструкция C++, которую я хочу заменить лямбда-выражением, выглядит примерно так:
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)));
}
, которая может быть упрощена до:
void registerCallback(/* WHAT GOES HERE? */);
void foo(void) {
int a, b, c;
registerCallback([=](int arg){std::cout << (a+b+c)*arg << std::endl; })
}
Итак, что происходит там, где я написал /* ЧТО ЗДЕСЬ? */
?
РЕДАКТИРОВАТЬ: Это сделано с целью сохранения обратного вызова, который будет вызван позже, а не для его немедленного потребления и вызова.