2010-09-10 86 views
0

基本上,我想知道如果像下面的東西是可能的?如果這是不可能的,有什麼辦法可以僞造它?有沒有辦法在不在當前範圍內的lambda中使用變量?

#include <iostream> 
using namespace std; 

template<typename Functor> 
void foo(Functor func) 
{ 
    auto test = [](Functor f){ int i = 5; f(); }; 
    test(func); 
} 

int main() 
{ 
    foo([](){ cout << i << endl;}); 
} 
+1

爲什麼不讓'i'成爲一個參數? – kennytm 2010-09-10 17:31:32

+0

要麼讓我參數或我想找一個編譯器,會做一些動態範圍界定? – SubSevn 2010-09-10 17:33:51

+0

@KennyTM:我正在編寫一個生成C++的小型編譯器。我想用這樣的東西來創建'let'語句。 – Ryan 2010-09-10 17:34:58

回答

1

您可以使i作爲函數的參數。

#include <iostream> 
using namespace std; 

template<typename Functor> 
void foo(Functor func) 
{ 
    auto test = [](Functor f){ f(5); }; 
    test(func); 
} 

int main() 
{ 
    foo([](int i){ cout << i << endl;}); 
} 

否則,我認爲你有一個範圍是從兩個地方,例如訪問申報i作爲全局變量:

#include <iostream> 
using namespace std; 

static int i; // <--- :(

template<typename Functor> 
void foo(Functor func) 
{ 
    auto test = [](Functor f){ i = 5; f(); }; 
    test(func); 
} 

int main() 
{ 
    foo([](){ cout << i << endl;}); 
} 
相關問題