2011-05-02 124 views
22

這是一個後續問題這個問題:Lambda how can I pass as a parameter轉換lambda表達式爲一個函數指針

MSDN據稱已標記的項目作爲固定的。我看了一下規格說明,但是我很難將它們的規格轉換成語法應該是的。

因此,例如:

void printOut(int(*eval)(int)) 
{ 
    for(int x = 0; x < 4; ++x) 
    { 
     std::cout << eval(x) << std::endl; 
    } 
} 

現在說我有拉姆達:

auto lambda1 = [](int x)->int{return x;}; 

什麼是lambda1轉換爲功能等同的指針,因此它可以被傳遞給printOut語法?

另外,實際上在括號裏有什麼東西的lambda表達式呢?例如:

int y = 5; 
auto lambda2 = [y](void)->int{return y;}; 

如果這種拉姆達不能被轉換爲函數指針,有用於使這種類型的lambda表達式來printOut(或甚至改性的printOut版本,如果這樣的替代方法什麼語法)?

+0

「MSDN據稱已將該項目標記爲已修復。」 Connect錯誤表示「此問題已得到解決,並將在未來的版本中提供。」它並沒有說該修補程序可用於當前版本的編譯器。 – 2011-05-02 04:28:01

+0

哦。我想我太天真了,假設sp1會包含這個修正:P – helloworld922 2011-05-02 05:29:57

+0

哦;道歉,我沒有看到連接錯誤的日期(我猜想這很有趣,因爲我報告了它)。它可能沒有達到吧,然後進入服務包。 – 2011-05-02 14:28:17

回答

17

本身沒有語法,它是一種隱式轉換。只需簡單地將其轉換(顯式或隱式),即可獲得函數指針。但是,在Visual Studio 2010發佈之後,這個問題就解決了,所以不存在。


你不能讓一個捕捉全拉姆達成一個函數指針永遠,正如你提到的,所以它的功能是printOut將不得不改變。您可以概括函數本身:

// anything callable 
template <typename Func> 
void printOut(Func eval) 
{ 
    // ... 
} 

或者概括的功能類型,特別是:

// any function-like thing that fits the int(int) requirement 
void printOut(std::function<int(int)> eval) 
{ 
    // ... 
} 

每個人都有自己的權衡。


†就我所知,我們不知道我們會在服務包中獲得它,或者如果我們需要等到新版本發佈。