如何声明一个接受lambda的函数?

我在网上阅读了许多教程,解释了如何使用lambdas与标准库(如std::find ),他们都非常有趣,但我找不到任何解释如何使用lambda为我自己的function。

例如:

 int main() { int test = 5; LambdaTest([&](int a) { test += a; }); return EXIT_SUCCESS; } 

我应该如何申报LambdaTest ? 第一个参数的types是什么? 然后,我怎样才能调用传递给它的匿名函数 – 例如 – “10”作为它的参数?

考虑到你可能还想接受函数指针和函数对象,除了lambdas,你可能会想使用模板接受任何参数与operator() 。 std函数就像find一样。 它看起来像这样:

 template<typename Func> void LambdaTest(Func f) { f(10); } 

请注意,此定义不使用任何c ++ 0xfunction,因此它完全向后兼容。 这只是使用lambdaexpression式调用c ++ 0x特定的函数。

如果你不想模板的一切,你可以做到以下几点:

 void LambdaTest (const std::function <void (int)>& f) { ... } 

我想提供这个简单而明了的例子。 它演示了如何将“可调用事物”(函数,函数对象和lambdaexpression式)传递给函数或对象。

 // 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 (); } // ()