Leí en Internet muchos tutoriales que explicaban cómo usar lambdas con la biblioteca estándar (como std::find
), y todos eran muy interesantes, pero no pude encontrar ninguno que explicara cómo puedo usar una lambda para mis propias funciones.
Por ejemplo:
int main()
{
int test = 5;
LambdaTest([&](int a) { test += a; });
return EXIT_SUCCESS;
}
¿Cómo debo declarar LambdaTest
? ¿Cuál es el tipo de su primer argumento? Y luego, ¿cómo puedo llamar a la función anónima que le pasa, por ejemplo, "10" como argumento?
std::function
también es perfectamente capaz de tomar tipos de clases de objetos de función, aunque es un poco más lento al llamar. Pero esa diferencia es insignificante para la mayoría de las aplicaciones :)functor
que es agradable, pero realmente no responde a la pregunta original (y lo que me llevó aquí) que era "cómo uso una lambda para mis propias funciones" . Además, las plantillas tienen su propio conjunto de problemas, que la respuestastd::function
no tiene.Si no desea crear una plantilla para todo, puede hacer lo siguiente:
void LambdaTest (const std::function <void (int)>& f) { ... }
fuente
std::function
(no es una referencia), hace una copia def
. Sin embargo, no estoy seguro de cómo lambda / closures manejan las referencias cuando el objeto al que se hace referencia sale del alcance, probablemente UB. @FredOverflow: Tengo entendido questd::function
no es un objeto trivial, especialmente cuando se envuelven lambdas. Probablemente sea mejor hacer referencia a él para evitar copias innecesarias.Me gustaría contribuir con este ejemplo simple pero que se explica por sí mismo. Muestra cómo pasar "cosas invocables" (funciones, objetos de función y lambdas) a una función o un objeto.
// g++ -std=c++11 thisFile.cpp #include <iostream> #include <thread> using namespace std; // ----------------------------------------------------------------- class Box { public: function<void(string)> theFunction; bool funValid; Box () : funValid (false) { } void setFun (function<void(string)> f) { theFunction = f; funValid = true; } void callIt () { if ( ! funValid ) return; theFunction (" hello from Box "); } }; // class // ----------------------------------------------------------------- class FunClass { public: string msg; FunClass (string m) : msg (m) { } void operator() (string s) { cout << msg << s << endl; } }; // ----------------------------------------------------------------- void f (string s) { cout << s << endl; } // () // ----------------------------------------------------------------- void call_it ( void (*pf) (string) ) { pf( "call_it: hello"); } // () // ----------------------------------------------------------------- void call_it1 ( function<void(string)> pf ) { pf( "call_it1: hello"); } // () // ----------------------------------------------------------------- int main() { int a = 1234; FunClass fc ( " christmas "); f("hello"); call_it ( f ); call_it1 ( f ); // conversion ERROR: call_it ( [&] (string s) -> void { cout << s << a << endl; } ); call_it1 ( [&] (string s) -> void { cout << s << a << endl; } ); Box ca; ca.callIt (); ca.setFun (f); ca.callIt (); ca.setFun ( [&] (string s) -> void { cout << s << a << endl; } ); ca.callIt (); ca.setFun (fc); ca.callIt (); } // ()
fuente
if ( ! theFunction )