Przeczytałem w Internecie wiele samouczków, które wyjaśniały, jak używać lambd w standardowej bibliotece (np. std::find
) I wszystkie były bardzo interesujące, ale nie mogłem znaleźć żadnego, który wyjaśniałby, jak mogę używać lambdy do moich własnych funkcji.
Na przykład:
int main()
{
int test = 5;
LambdaTest([&](int a) { test += a; });
return EXIT_SUCCESS;
}
Jak mam zgłosić LambdaTest
? Jaki jest jego pierwszy argument? A potem, jak mogę wywołać funkcję anonimową przekazującą jej - na przykład - „10” jako jej argument?
std::function
doskonale radzi sobie również z typami klas obiektów funkcji, chociaż jest trochę wolniejszy podczas wywoływania. Ale ta różnica jest znikoma dla większości aplikacji :)functor
co jest miłe, ale tak naprawdę nie odpowiada na pierwotne pytanie (i co mnie tu przywiodło), które brzmiało: "Jak używać lambdy dla moich własnych funkcji" . Ponadto szablony mają własny zestaw problemów, których odpowiedźstd::function
nie zawiera.Jeśli nie chcesz tworzyć szablonów wszystkiego, możesz wykonać następujące czynności:
#include<functional> void LambdaTest (const std::function <void (int)>& f) { ... }
źródło
std::function
plik (nie jako odniesienie), utworzysz kopięf
. Jednak nie jestem pewien, jak lambda / zamknięcia obsługują odwołania, gdy obiekt, do którego się odwołujesz, wykracza poza zakres, prawdopodobnie UB. @FredOverflow: Rozumiem, żestd::function
nie jest to trywialny obiekt, zwłaszcza podczas pakowania lambd. Prawdopodobnie lepiej jest odwołać się do niego, aby uniknąć niepotrzebnego kopiowania.Chciałbym przedstawić ten prosty, ale oczywisty przykład. Pokazuje, jak przekazać „wywoływalne rzeczy” (funkcje, obiekty funkcji i wyrażenia lambda) do funkcji lub do obiektu.
// 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 (); } // ()
źródło
if ( ! theFunction )