将lambda存储在std::function
中而不是auto variable
中有什么好处。例如,在下面的代码中,我将lambda存储在variable f1
中,而不是存储在std::function f
中。
#include <iostream>
#include <functional>
using namespace std;
void global_f() {
cout << "global_f()" << endl;
}
struct Functor {
void operator()() { cout << "Functor" << endl; }
};
int main() {
std::function<void()> f;
cout << "sizeof(f) == " << sizeof(f) << endl;
f = global_f;
f();
auto f1 = [](){ cout << "Lambda" << endl;};
f1();
Functor functor;
f = functor;
f();
}
答案 0 :(得分:1)
在您的简单示例中,将lambda存储在std::function
中没有任何好处。通常,使用auto
存储lambda效率更高,但也有严格的限制。 auto
版本只能用作局部变量。如果要存储lambda供以后使用,则必须使用std::function
。
例如,您可能想将lambda存储在类成员中。考虑以下课程:
class Foo
{
std::function<void()> callback_;
public:
void Bar(int value)
{
callback_ = [value] { DoStuff(value); }
}
/* other constructors and methods omitted */
}
在这种情况下,您不能使用auto
,因为lambda的类型是匿名的,并且只能在Bar
方法中使用。
std::function
也很有用。该函数无法知道lambda的类型,但可以声明一个std::function
参数。例如:
void Foo(std::function<void()> callback);
...
Foo([](){ cout << "Lambda" << endl;});
值得指出的是,这不适用于功能模板。在这种情况下使用lambda时,通常最好让编译器推断lambda的类型(类似于使用auto
)。例如:
template <class F> void Foo(F&& callback) { /* details */ }
...
Foo([](){ cout << "Lambda" << endl;}