2010-05-23 15 views
13

Utilizzo di C++ 0x, come posso acquisire una variabile quando ho un lambda all'interno di un lambda? Per esempio:Lambda di chiusura e nidificazione in 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

direi assegnazione della variabile nella prima chiusura potrebbe aiutare. –

+3

Quanto sopra va bene su gcc4.5 - stai usando VC10? –

+1

Sì, VC10. Lo riferirò a Microsoft. – DanDan

risposta

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; 
       } 
      ); 
     } 
    ); 

Non particolarmente pulito, ma funziona.

+0

Grazie per la soluzione, si spera che verrà risolto in una versione successiva. – DanDan

1

Il meglio che ho potuto venire in mente è questa:

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; 
      }); 
    }); 

problema interessante! Ci dormirò sopra e vedrò se riesco a capire qualcosa di meglio.

+0

è 'vv' richiesto? Il lamdba interiore funzionerà senza? –

0

Nel lambda interna si dovrebbe avere (supponendo che si vuole passare la variabile per riferimento):

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

    int a =v; 
}