Вызовите одну и ту же лямбду несколько раз в C ++ - PullRequest
0 голосов
/ 11 октября 2018

Можно ли использовать лямбду?Я хотел бы назвать эту лямбду несколько раз.Но я не могу найти способ дать ему имя.

[]() { cout << "lambda is called"; };

И какова цель лямбды, не вызывая так?Компилятор не кричит на приведенный выше код, но он бесполезен.Я прав?

Ответы [ 5 ]

0 голосов
/ 11 октября 2018

Сохраните лямбду, используя auto, или явно назначьте ее совместимой функции std :: function:

auto f1 = [](int x, int y)->float{ ..... };
std::function<float(int,int)> f2 = [](int x, int y)->float{ ..... };
float x = f1(3,4);
auto y = f2(5,6);
std::function<float(int,int)> f3 = f1;
0 голосов
/ 11 октября 2018

Вы можете легко присвоить лямбда-имя имя, присвоив его переменной auto - например, так:

const auto l = [] { whatever };

Затем несколько раз вызовите l как l();.

0 голосов
/ 11 октября 2018

Вы можете дать ему имя, используя спецификатор auto:

auto f = []() { cout << "lambda is called"; };

Это позволит вам вызвать его с помощью f().Но имейте в виду, что тип лямбды не указан, поэтому, если вы хотите передать его в функции, вам нужно будет использовать шаблоны (или конвертировать в std::function<void()>).

template <typename F>
void three_times(F g) {
    g(); g(); g();
}
0 голосов
/ 11 октября 2018

Да, лямду можно использовать повторно.Смотрите пример ниже

#include <iostream>
using namespace std;
template <typename F> void func2(F f) {
  f("func2");
}
void func(function<void(const char *)> f) {
  f("func");
}
int main() {
  auto l = [](const char *s) {
             cout << s << "\n";
           };
  for (int i = 0; i < 2; i++) {
    l("main"); // Calling lambda multiple times
    func(l);   // Passing lambda to a function using function<>
    func2(l);  // Passing lambda to a function using template
  }
  return 0;
}

Output:
main
func
func2
main
func
func2
0 голосов
/ 11 октября 2018

Если вы хотите повторно использовать лямбду, вам нужно присвоить ее переменной.

auto lambda = []() { cout << "lambda is called"; };

дает вам объект с именем lambda, который вы можете вызвать operator () для выполнения телалямбда-лайк

lambda();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...