2010-05-23 15 views
13

Mit C++ 0x, wie erfasse ich eine Variable, wenn ich ein Lambda innerhalb eines Lambda habe? Zum Beispiel:Closure und verschachtelte Lambdas 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

Ich würde vermuten, die Variable in dem ersten Verschluss zuweisen könnte helfen. –

+3

Das obige ist gut auf gcc4.5 - verwenden Sie VC10? –

+1

Ja, VC10. Ich werde es Microsoft melden. – DanDan

Antwort

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

Nicht besonders sauber, aber es funktioniert.

+0

Vielen Dank für die Problemumgehung, hoffentlich wird dies in einer späteren Version behoben. – DanDan

1

Das Beste, was ich tun konnte, ist dies:

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

Interessantes Problem! Ich werde darauf schlafen und sehen, ob ich etwas besseres herausfinden kann.

+0

ist 'vv' erforderlich? Wird die innere Lamdba ohne arbeiten? –

0

Im inneren Lambda Sie haben sollen (vorausgesetzt, Sie wollen die Variable durch Verweis übergeben):

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

    int a =v; 
}