2010-05-23 9 views
13

Przy użyciu C++ 0x, jak przechwycić zmienną, gdy mam lambda w zakresie lambda? Na przykład:Zamknięcie i zagnieżdżone lambdy w C++ 0x

std::vector<int> c1; 
int v = 10; <--- I want to capture this variable 

std::for_each(
    c1.begin(), 
    c1.end(), 
    [v](int num) <--- This is fine... 
    { 
     std::vector<int> c2; 

     std::for_each(
      c2.begin(), 
      c2.end(), 
      [v](int num) <--- error on this line, how do I recapture v? 
      { 
       // Do something 
      }); 
    }); 
+0

Chciałbym odgadnąć przypisując zmiennej w pierwszej zamknięcia może pomóc. –

+3

Powyższe informacje są poprawne w gcc4.5 - czy używasz VC10? –

+1

Tak, VC10. Przekażę to firmie Microsoft. – DanDan

Odpowiedz

8
std::for_each(
     c1.begin(), 
     c1.end(), 
     [&](int num) 
     { 
      std::vector<int> c2; 
      int& v_ = v; 
      std::for_each(
       c2.begin(), 
       c2.end(), 
       [&](int num) 
       { 
        v_ = num; 
       } 
      ); 
     } 
    ); 

Niezwykle czysty, ale działa.

+0

Dzięki za obejście tego problemu, mam nadzieję, że zostanie to naprawione w późniejszej wersji. – DanDan

1

Najlepszym mogę wymyślić to:

std::vector<int> c1; 
int v = 10; 

std::for_each(
    c1.begin(), 
    c1.end(), 
    [v](int num) 
    { 
     std::vector<int> c2; 
     int vv=v; 

     std::for_each(
      c2.begin(), 
      c2.end(), 
      [&](int num) // <-- can replace & with vv 
      { 
       int a=vv; 
      }); 
    }); 

ciekawy problem! Zasnę na tym i zobaczę, czy mogę wymyślić coś lepszego.

+0

czy 'vv' jest wymagany? Czy wewnętrzna lamdba działa bez? –

0

W wewnętrznej lambda powinna masz (zakładając, że chcesz przekazać zmienną przez odniesienie):

[&v](int num)->void{ 

    int a =v; 
}