2010-06-07 134 views
28

我想將一個lambda表達式傳遞給一個函數指針的函數,這甚至有可能嗎?lambda表達式是否可以作爲函數指針傳遞?

下面是一些示例代碼,我使用VS2010:

#include <iostream> 
using namespace std; 

void func(int i){cout << "I'V BEEN CALLED: " << i <<endl;} 

void fptrfunc(void (*fptr)(int i), int j){fptr(j);} 

int main(){ 
    fptrfunc(func,10); //this is ok 
    fptrfunc([](int i){cout << "LAMBDA CALL " << i << endl; }, 20); //DOES NOT COMPILE 
    return 0; 
} 
+0

使用gcc-4.5.1在Linux上編譯並運行(但不在4.4.3中編譯,沒有lambda表達式) – Cubbi 2010-06-07 22:42:30

回答

26

在VC10 RTM,沒有 - 但在VC10拉姆達功能最終定稿之後,標準委員會並添加語言,允許無國籍lambda表達式來降級爲函數指針。所以在未來這將是可能的。

+0

你還記得在哪一節嗎?這很有趣。 – rlbond 2010-06-07 21:46:13

+3

@rlbond:N3090/3092,§5.1.2/ 6 – 2010-06-07 21:54:09

+0

通過無狀態lambda,你的意思是一個lambda沒有通過值或引用接受局部變量? – balki 2011-08-17 17:03:21

0

不可以。至少不可靠。我知道VS2010將它們實現爲對象函子。根據他們的工作方式,這可能是先驗要求。

13

您可以使用std::function此:

void fptrfunc(std::function<void (int)> fun, int j) 
{ 
    fun(j); 
} 

或者去完全通用:

template <typename Fun> 
void fptrfunc(Fun fun, int j) 
{ 
    fun(j); 
} 
4

這個工作在VS2010:

template<class FunctorT> 
void* getcodeptr(const FunctorT& f) { 
    auto ptr = &FunctorT::operator(); 
    return *(void**)&ptr; 
} 

void main() { 
    auto hello = [](char* name){ printf("hello %s\n", name); }; 
    void(*pfn)(char*) = (void(*)(char*)) getcodeptr(hello); 
    pfn("world"); 
} 
+0

這似乎不工作...我得到的輸出是hello _ – subzero 2015-06-24 04:55:09

0

只要拉姆達不使用捕獲子句(即不捕獲上面的變量),它可以用作函數指針。 VC編譯器內部使用不同的調用約定生成匿名函數,以便可以毫無問題地使用它。