2010-05-23 36 views
13

Sử dụng C++ 0x, làm thế nào để tôi nắm bắt một biến khi tôi có một lambda trong một lambda? Ví dụ:Đóng cửa và lồng nhau lambdas trong 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

tôi sẽ đoán gán biến trong việc đóng cửa đầu tiên có thể giúp đỡ. –

+3

Ở trên là tốt trên gcc4.5 - bạn đang sử dụng VC10? –

+1

Có, VC10. Tôi sẽ báo cáo cho Microsoft. – DanDan

Trả lời

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

Không đặc biệt sạch, nhưng nó hoạt động.

+0

Cảm ơn bạn đã giải quyết sự cố này, hy vọng điều này sẽ được khắc phục trong phiên bản sau. – DanDan

1

Điều tốt nhất tôi có thể đưa ra là thế này:

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

Thú vị vấn đề! Tôi sẽ ngủ trên đó và xem liệu tôi có thể hình dung ra điều gì đó tốt hơn không.

+0

là 'vv'? Liệu lamdba bên trong có hoạt động không? –

0

Trong lambda bên trong bạn nên có (giả sử bạn muốn vượt qua các biến bằng cách tham khảo):

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

    int a =v; 
}