Как объявить функцию, которая принимает лямбда?
Я прочитал в Интернете много руководств, в которых объяснялось, как использовать лямбда со стандартной библиотекой (например, std::find
), и все они были очень интересными, но я не мог найти ни одного объяснения, как я могу использовать лямбда для моих собственных функций.
Например:
int main()
{
int test = 5;
LambdaTest([&](int a) { test += a; });
return EXIT_SUCCESS;
}
Как объявить LambdaTest
? Какой тип его первого аргумента? И затем, как я могу назвать анонимную функцию, передаваемую ему, например, - "10" в качестве аргумента?
Ответы
Ответ 1
Учитывая, что вы, вероятно, также хотите принять указатели на функции и объекты функций в дополнение к lambdas, вы, вероятно, захотите использовать шаблоны для принятия любых аргументов с помощью operator()
. Это то, что делают std-функции, такие как find. Это будет выглядеть так:
template<typename Func>
void LambdaTest(Func f) {
f(10);
}
Обратите внимание, что это определение не использует никаких функций С++ 0x, поэтому оно полностью обратно совместимо. Это только вызов функции с использованием лямбда-выражений, что С++ 0x-specific.
Ответ 2
Если вы не хотите, чтобы все шаблоны, вы можете сделать следующее:
void LambdaTest (const std::function <void (int)>& f)
{
...
}
Ответ 3
Я хотел бы внести этот простой, но объяснительный пример. Он показывает, как передать "вызываемые вещи" (функции, объекты функций и lambdas) в функцию или объект.
// 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 ();
} // ()