Hay dos maneras de utilizar la variable función lambda:variables de la función lambda en C++ 11
std::function<int(int, int)> x1 = [=](int a, int b) -> int{return a + b;};
//usage
void set(std::function<int(int, int)> x);
std::function<int(int, int)> get();
Y:
std::function<int(int, int)>* x2 = new std::function<int(int, int)>([=](int a, int b) -> int{return a + b;});
//usage
void set(std::function<int(int, int)>* x);
std::function<int(int, int)>* get();
Me gustaría saber cuáles son las diferencias, porque hago no sabe cómo se almacenan los datos de la función lambda.
Me gustaría saber la mejor manera en términos de rendimiento, uso de memoria y la mejor manera de pasar una función lambda como argumento o devolver la función lambda.
Preferiría usar punteros si el tamaño del objeto de la función lambda es mayor que 4 o para evitar errores (si algún tipo de constructor de copia se ejecuta cuando hago una atribución o si se ejecuta algún tipo de destructor cuando no lo hago querer).
¿Cómo debo declarar las variables de función lambda?
EDITAR
quiero evitar copias y se mueve, quiero seguir usando la misma función otra vez.
¿Cómo debo cambiar este ejemplo?
int call1(std::function<int(int, int)> f){
return f(1, 2);
}
int call2(std::function<int(int, int)> f){
return f(4, 3);
}
std::function<int(int, int)>& recv(int s){
return [=](int a, int b) -> int{return a*b + s;};
}
int main(){
std::function<int(int, int)> f1, f2;
f1 = [=](int a, int b) -> int{return a + b;};
f2 = recv(10);
call1(f1);
call2(f1);
call1(f2);
call2(f2);
}
no puedo volver referencia en el recv función:
warning: returning reference to temporary
Es esta una buena solución?
int call1(std::function<int(int, int)>* f){
return (*f)(1, 2);
}
int call2(std::function<int(int, int)>* f){
return (*f)(4, 3);
}
std::function<int(int, int)>* recv(int s){
return new std::function<int(int, int)>([=](int a, int b) -> int{return a*b + s;});
}
int main(){
std::function<int(int, int)> f1 = [=](int a, int b) -> int{return a + b;};
std::function<int(int, int)> *f2 = recv(10);
call1(&f1);
call2(&f1);
call1(f2);
call2(f2);
delete f2;
}
EDIT (Conclusión)
A lambda objeto de función es como cualquier objeto que es instancia de una clase. Las reglas para asignación, argumentos y atribución son las mismas.
"Prefiero usar punteros si el tamaño del objeto de función lambda es mayor que 4" ¿Por qué? ¿Crees que la pila implosionará si hay un objeto de más de 4 bytes sobre ella? La práctica estándar de C++ es poner objetos en la pila por * default *, a menos que tenga una buena razón para no hacerlo. Y tener más de 4 bytes no es uno. –