将lambda存储在`std :: function`中而不是`auto variable`中有什么好处?

时间:2018-11-07 14:46:35

标签: c++ lambda std-function

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

1 个答案:

答案 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方法中使用。

当您想将lambda用作常规函数的参数时,

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;}