Actualmente estoy haciendo algunos ejercicios con funciones de plantilla. Tuve la tarea de escribir una implementación del algoritmo de transformación. lo hice como el siguiente y funciona:lambda con plantillas
template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
while (b != e)
*d++ = p(*b++);
return d;
}
Como con la normal transformar tengo que llamar el predicado con un tipo explícito como
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
Ahora, me topé con el C++ 11 lambdas y quería llamar a mi función como esta:
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;});
con eso me pongo un error del compilador que el tipo no puede ser deducido. Esto es lo que no entiendo, ya que estoy definiendo el tipo T en mi lambda en realidad dos veces.
También revisé la función de transformación original, con la que está trabajando. Luego revisé el implementation de ese y obviamente se implementa con una clase de plantilla para toda la función. ¿Es esa la forma correcta de implementar predicados con plantillas?
Pensé que después de leer la implementación de la transformación, eso hace que sea mucho más fácil también. Todavía me pregunto por qué no trabajo en el otro caso. – inf
@bamboon Supongo que una lambda no es una función sino un objeto de función, ya que también puede mantener el estado (es un cierre y no solo una función). –
Tenga en cuenta que una lambda que no realiza ninguna captura es convertible a una función ordinaria (puntero). – spraff