Как я могу записать результат функции в лямбда?

#c #lambda #capture

#c #лямбда #захват

Вопрос:

Мне было интересно, могу ли я записать результат функции:

 int main()
{
    struct A { int a; int func() { return a; } };

    A a;

    
    auto lambda = []() {};
    // I WANT THE LAMBDA TO HAVE A COPY OF a.func();
    // In other words I want capture the return value of a.func()


   
}
  

Есть ли способ сделать это? Я знаю, что в более новых стандартах C вы можете создавать новые переменные в списке захвата, так что что-то вроде этого?

 auto lambda = [int copy = a.func()] () {   cout << copy; }
  

Комментарии:

1. … да? Вы можете сделать именно это. Но удалите слово int

Ответ №1:

Синтаксис немного отличается. Тип объекта в группе захвата выводится из инициализатора, и вы не можете явно указать тип:

 auto lambda = [copy = a.func()] () { std::cout << copy; };
           // ^ no int
  

Вы также можете создать несколько объектов разных типов в группе захвата, если вы просто разделите их на , :

 auto lambda = [x = a.func(), y = a.func2()] () { std::cout << x << y; };
  

Вот демонстрация.

Комментарии:

1. Неплохо. И для нескольких переменных? Можете ли вы выполнить [a = a.func(), b = a.func2()] () { } ??? Я разделил его запятой…

2. @Рыбка Данио да, вы можете. См . Лямбда-выражения на cppreference.com : » захваты — разделенный запятыми список из нуля или более захватов, необязательно начинающийся с захвата по умолчанию».