C++ 如何声明一个接受 lambda 的函数?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2938571/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to declare a function that accepts a lambda?
提问by Thomas Bonini
I read on the internet many tutorials that explained how to use lambdas with the standard library (such as std::find
), and they all were very interesting, but I couldn't find any that explained how I can use a lambda for my own functions.
我在互联网上阅读了许多解释如何将 lambda 与标准库(例如std::find
)一起使用的教程,它们都很有趣,但我找不到任何解释如何将 lambda 用于我自己的函数的教程。
For example:
例如:
int main()
{
int test = 5;
LambdaTest([&](int a) { test += a; });
return EXIT_SUCCESS;
}
How should I declare LambdaTest
? What's the type of its first argument? And then, how can I call the anonymous function passing to it - for example - "10" as its argument?
我该如何申报LambdaTest
?它的第一个参数的类型是什么?然后,我如何调用传递给它的匿名函数 - 例如 - “10”作为它的参数?
采纳答案by sepp2k
Given that you probably also want to accept function pointers and function objects in addition to lambdas, you'll probably want to use templates to accept any argument with an operator()
. This is what the std-functions like find do. It would look like this:
鉴于除了 lambdas 之外,您可能还想接受函数指针和函数对象,您可能想使用模板来接受任何带有operator()
. 这就是像 find 这样的标准函数所做的。它看起来像这样:
template<typename Func>
void LambdaTest(Func f) {
f(10);
}
Note that this definition doesn't use any c++0x features, so it's completely backwards-compatible. It's only the call to the function using lambda expressions that's c++0x-specific.
请注意,此定义不使用任何 c++0x 功能,因此它完全向后兼容。它只是使用特定于 c++0x 的 lambda 表达式调用函数。
回答by doublep
If you don't want to template everything, you can do the following:
如果您不想模板化所有内容,可以执行以下操作:
void LambdaTest (const std::function <void (int)>& f)
{
...
}
回答by cibercitizen1
I would like to contribute this simple but self-explanatory example. It shows how to pass "callable things" (functions, function objects, and lambdas) to a function or to an object.
我想贡献这个简单但不言自明的例子。它展示了如何将“可调用的东西”(函数、函数对象和 lambda 表达式)传递给函数或对象。
// 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 ();
} // ()