Я прочитал в Интернете множество руководств, в которых объяснялось, как использовать лямбды со стандартной библиотекой (например, std::find
), и все они были очень интересными, но я не мог найти ни одного, объясняющего, как я могу использовать лямбда-выражения для моих собственных функций.
Например:
int main()
{
int test = 5;
LambdaTest([&](int a) { test += a; });
return EXIT_SUCCESS;
}
Как мне заявить LambdaTest
? Каков тип его первого аргумента? И затем, как я могу вызвать анонимную функцию, передаваемую ей - например, - «10» в качестве аргумента?
std::function
также отлично может принимать типы классов объектов функций, хотя при вызове работает немного медленнее. Но эта разница незначительна для большинства приложений :)functor
хороший, но не совсем ответ на исходный вопрос (и что меня сюда привело), а именно «как мне использовать лямбду для моих собственных функций» . Кроме того, у шаблонов есть свой собственный набор проблем, на который нет ответаstd::function
.Если вы не хотите использовать шаблон для всего, вы можете сделать следующее:
#include<functional> void LambdaTest (const std::function <void (int)>& f) { ... }
источник
std::function
(не в качестве ссылки), вы сделаете копиюf
. Однако я не уверен, как лямбда / замыкания обрабатывают ссылки, когда упомянутый объект выходит за пределы области видимости, возможно, UB. @FredOverflow: Насколько я понимаю,std::function
это нетривиальный объект, особенно при переносе лямбда-выражений. Вероятно, лучше ссылаться на него, чтобы избежать ненужного копирования.Я хотел бы предложить этот простой, но не требующий пояснений пример. Он показывает, как передавать «вызываемые объекты» (функции, функциональные объекты и лямбда-выражения) в функцию или объект.
// 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 (); } // ()
источник
if ( ! theFunction )