En C++ 11, ¿cómo declara una función que toma una expresión lambda como argumento? Puedo encontrar muchos recursos en línea para declarar lambdas o tomarlos como parámetros de plantilla, pero lo que realmente me gustaría hacer es poder hacer uso de lambdas como manejadores de devolución de llamada fáciles de declarar, similar a lo que es posible gracias a los cierres en JavaScript y bloques de código en Objective-C.Parámetro/tipo de almacenamiento para C++ 11 lambda
En esencia, el clásico C++ construir quiero reemplazar con una lambda es algo así como:
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)));
}
que se simplifica en:
void registerCallback(/* WHAT GOES HERE? */);
void foo(void) {
int a, b, c;
registerCallback([=](int arg){std::cout << (a+b+c)*arg << std::endl; })
}
Entonces, ¿qué va a donde he escrito /* WHAT GOES HERE? */
?
EDITAR: Esto es con el fin de almacenar una devolución de llamada que se devolverá más tarde, en lugar de que se consuma y llame inmediatamente.
Usar tipos locales como argumentos de plantilla no es legal en C++ 03. Algunos compiladores lo permiten como una extensión sin embargo. – bames53
La ventaja de una lambda es que facilita la escritura de devoluciones de llamada. No especificas el código que se usará con lambdas, solo escribes un código que tomará un argumento 'function' y el que llama puede usar (o no) un lambda a su gusto. –
@ barnes53 El código que publiqué no usa tipos locales como un argumento de plantilla. MyCallback es un tipo global, y el tipo local está siendo envuelto en std :: shared_ptr. Utilizo este patrón todo el tiempo, por lo que estoy interesado en la forma en que C++ 11 lo mejora. :) –
fluffy