2010-05-23 21 views
13

Usando C++ 0x, ¿cómo puedo capturar una variable cuando tengo una lambda dentro de una lambda? Por ejemplo:Cierre y lambdas anidados en 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

Conjeturaría asignación de la variable en el primer cierre podría ayudar. –

+3

Lo anterior está bien en gcc4.5 - ¿está usando VC10? –

+1

Sí, VC10. Lo reportaré a Microsoft. – DanDan

Respuesta

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

No especialmente limpio, pero funciona.

+0

Gracias por la solución, espero que esto se solucione en una versión posterior. – DanDan

1

Lo mejor que podía llegar a esto es:

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 interesante! Dormiré allí y veré si puedo encontrar algo mejor.

+0

se requiere 'vv'? ¿Funcionará la lamdba interna sin? –

0

En el interior lambda que debe tener (asumiendo que usted quiere pasar la variable de referencia):

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

    int a =v; 
}