Re: Почему лямбды могут захватывать только локальные переменные?
От: Анатолий Широков СССР  
Дата: 25.07.13 14:54
Оценка: +2
Здравствуйте, enji, Вы писали:

E>Неудобно же


А ты this не пробовал пробрасывать в качестве контекста?
Re[4]: Почему лямбды могут захватывать только локальные переменные?
От: Evgeny.Panasyuk Россия  
Дата: 25.07.13 16:18
Оценка: 11 (1)
Здравствуйте, Шахтер, Вы писали:

E>>Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект

Ш>
Ш>  void test()
Ш>   {
Ш>    Call( [=] () { return a+b; }  );
Ш>   }
Ш>


#include <functional>
#include <iostream>
 
using namespace std;
 
struct Gadget
{
    void operator()(){}
    ~Gadget(){ cout << "~" << endl; }
};
 
struct Widget
{
    Gadget x;
    function<void()> operator()()
    {
        return [=]{ x(); cout << "lambda" << endl; };
    }
};
int main()
{
   auto &&x = Widget{}();
   x();
}

Вывод:
~
lambda
Почему лямбды могут захватывать только локальные переменные?
От: enji  
Дата: 25.07.13 14:41
Оценка:
Неудобно же
struct T {
  int a, b;
  void f() {
    int a = this->a, b = this->b;
    [a, b](){a+b;};    
  }
};
Re[2]: Почему лямбды могут захватывать только локальные переменные?
От: Кодт Россия  
Дата: 25.07.13 15:34
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>А ты this не пробовал пробрасывать в качестве контекста?


А у this поверхностное копирование, члены будут как по ссылке. Замыкание на сторону отдавать — печально.
Перекуём баги на фичи!
Re[2]: Почему лямбды могут захватывать только локальные переменные?
От: enji  
Дата: 25.07.13 15:48
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, enji, Вы писали:


E>>Неудобно же


АШ>А ты this не пробовал пробрасывать в качестве контекста?


Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект
Re[3]: Почему лямбды могут захватывать только локальные переменные?
От: Evgeny.Panasyuk Россия  
Дата: 25.07.13 16:03
Оценка:
Здравствуйте, enji, Вы писали:

E>Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект


А иногда нужно move-нуть в лямбду — сейчас нужно делать bind и вырисовывать тип/decltype в параметре лямбды:
vector<int> x(1 << 20);
bind([](decltype(x) &y)
{
    y.clear();
}, move(x))();


В C++14 будут generalized lambda-capture — если чего-то не хватает, можно сейчас попробовать за-proposal'ить
Re[3]: Почему лямбды могут захватывать только локальные переменные?
От: Шахтер Интернет  
Дата: 25.07.13 16:05
Оценка:
Здравствуйте, enji, Вы писали:

E>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>Здравствуйте, enji, Вы писали:


E>>>Неудобно же


АШ>>А ты this не пробовал пробрасывать в качестве контекста?


E>Кодт ответил уже. Иногда надо именно скопировать члены, а не указатель на объект




template <class T>
void Call(T func)
 {
  func();
 }

struct Temp
 {
  int a,b;

  void test()
   {
    Call( [=] () { return a+b; }  );
   }
 };
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.