2013-03-19 20 views
6

Na przykładJak przechwycić "to" w funkcji lambda w lambda?

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

lepszy sposób, aby uchwycić to w wewnętrznej lambda?

+1

@JesseGood, inni - nie jest to dupe z drugiej kwestii, ponieważ nie chodzi o MSVS. – einpoklum

Odpowiedz

6

Po prostu użyj [=], jest to niejawnie przechwycone. Jeśli masz inne zmienne, których nie chcesz przechwytywać przez kopiowanie, po prostu przechwyć [this].

+0

Dla zrozumienia, dlaczego nie "[i]? –

+0

@ bash.d: 'ten' może być przechwycony tylko przez kopiowanie, tj.' [This] 'lub' [=] '. –

+0

@JesseDobra OK, dziękuję, dobrze wiedzieć. –

5

Można po prostu re-capture this:

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

W moim VS2010, to nie działa. – user1899020

+0

@ user1899020: OK, nie wiedziałem, gdzie używasz VS2010, więc nie przetestowałem go tam. Wydaje mi się, że implementacja lambdas w VC10 nie jest zgodna. –

+2

@ user1899020 Wydaje się, że VS10 obsługuje tylko Lambdas V1.0, a nie V1.1, zobacz tutaj http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language -features-in-vc10-the-table.aspx. – inf