c++ - tutorial - operador lambda python
Lambda de un lambda: la función no se captura. (2)
El siguiente programa no compila:
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <cstdlib>
#include <cmath>
void asort(std::vector<double>& v, std::function<bool(double, double)> f)
{
std::sort(v.begin(), v.end(), [](double a, double b){return f(std::abs(a), std::abs(b));});
}
int main()
{
std::vector<double> v({1.2, -1.3, 4.5, 2.3, -10.2, -3.4});
for (unsigned int i = 0; i < v.size(); ++i) {
std::cout<<v[i]<<" ";
}
std::cout<<std::endl;
asort(v, [](double a, double b){return a < b;});
for (unsigned int i = 0; i < v.size(); ++i) {
std::cout<<v[i]<<" ";
}
std::cout<<std::endl;
return 0;
}
porque :
error : ''f'' is not captured
¿Qué significa y cómo resolver el problema?
En efecto, está haciendo referencia a f, que es una variable en el ámbito externo, en su lambda. Debe capturarlo en su lista de capturas (lo más simple es probablemente por referencia [& f], o [&] para capturar todo por referencia, ya que lo está usando de inmediato).
En otra nota, la función std :: tiene algo de sobrecarga al realizar el borrado de tipo, en su caso aquí podría ser mejor introducir un tipo de plantilla.
Utiliza el parámetro f
en la lambda dentro de asort()
, pero no lo captura. Intente agregar f
a la lista de captura (cambie []
para leer [&f]
).