В чем преимущество хранения лямбды в `std :: function` по сравнению с` auto variable`? - PullRequest
0 голосов
/ 07 ноября 2018

В чем преимущество хранения лямбды в std::function по сравнению с auto variable. Например, в приведенном ниже коде я храню лямбду в 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 голосов
/ 07 ноября 2018

В вашем простом примере хранение лямбды внутри std::function не имеет никакого преимущества. Зачастую хранение лямбды с использованием auto более эффективно, но также и весьма ограничительно. Версия auto может служить только локальной переменной. Если вы хотите сохранить лямбду для дальнейшего использования, вы должны использовать std::function.

Например, вы можете хранить лямбду внутри члена класса. Рассмотрим следующий класс:

class Foo
{
  std::function<void()> callback_;
public:
  void Bar(int value)
  {
    callback_ = [value] { DoStuff(value); }
  }
  /* other constructors and methods omitted */
}

В этом случае вы не можете использовать auto, поскольку лямбда-тип является анонимным и доступен только в методе Bar.

std::function также полезен, если вы хотите использовать лямбда-выражения в качестве аргументов обычных функций. Функция не может узнать тип лямбды, но вместо этого может объявить параметр std::function. Например:

void Foo(std::function<void()> callback);

...

Foo([](){ cout << "Lambda" << endl;});

Стоит отметить, что это не относится к шаблонам функций. При использовании лямбды в таком контексте обычно лучше позволить компилятору определять тип лямбды (аналогично использованию auto). Например:

template <class F> void Foo(F&& callback) { /* details */ }

...

Foo([](){ cout << "Lambda" << endl;}
...