2013-03-19 2 views
6

НапримерКак захватить «это» в лямбда-функции в лямбда?

class A 
{ 
    void f() {} 
    void g() 
    { 
     [this]() // Lambda capture this 
     { 
      f(); 
      A* p = this; 
      [p]() // Workaround to let inner lambda capture this 
      { 
       p->f(); 
      }; 
     }; 
    } 
}; 

ли лучший способ, чтобы захватить это во внутреннем лямбда?

+1

@JesseGood, другой - это не боян другого вопроса, поскольку речь идет не о МСВСЕ. – einpoklum

ответ

6

Просто используйте [=], это неявно зафиксировано. Если у вас есть другие переменные, которые вы не хотите захватить копией, просто запишите [this].

+0

Просто для понимания, почему бы не '[&]'? –

+0

@ bash.d: 'this' может быть захвачен только копией, то есть' [this] 'или' [=] '. –

+0

@JesseХорошо Хорошо, спасибо, приятно знать. –

5

Вы можете просто повторно захватить this:

class A 
{ 
    void f() {} 
    void g() 
    { 
     [this]() 
     { 
      f(); 
      [this]() 
     // ^^^^ 
      { 
       f(); 
      }; 
     }; 
    } 
}; 
+0

В моем VS2010 это не работает. – user1899020

+0

@ user1899020: Хорошо, не знал, где вы используете VS2010, поэтому я не тестировал его там. Я предполагаю, что реализация lambdas в VC10 не соответствует требованиям. –

+2

@ user1899020 Кажется, что VS10 поддерживает только Lambdas V1.0, а не V1.1, см. Здесь http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language -features-in-vc10-the-table.aspx. – inf