2010-06-07 27 views
28

Tôi đang cố gắng để vượt qua một biểu thức lambda đến một chức năng mà có một con trỏ hàm, điều này thậm chí có thể?Biểu thức lambda có thể được chuyển thành con trỏ hàm không?

Dưới đây là một số mẫu mã, Tôi đang sử dụng 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

Biên dịch và chạy với gcc-4.5.1 trên Linux (nhưng không biên dịch trong 4.4.3, không có lambdas) – Cubbi

Trả lời

26

Trong VC10 RTM, không có - nhưng sau khi tính năng lambda trong VC10 được hoàn thiện, Ủy ban tiêu chuẩn đã thêm ngôn ngữ cho phép lambdas stateless để làm suy giảm chức năng con trỏ. Vì vậy, trong tương lai điều này sẽ có thể.

+0

Bạn có nhớ phần nào nằm trong đó không? Hay đấy. – rlbond

+3

@rlbond: N3090/3092, §5.1.2/6 –

+0

Bằng lambda không quốc tịch, bạn có nghĩa là lambda không sử dụng biến cục bộ theo giá trị hoặc tham chiếu? – balki

0

No. Không thể. Không đáng tin cậy ít nhất. Tôi biết rằng VS2010 thực hiện chúng như là đối tượng functors. Dựa trên cách họ làm việc có thể là một yêu cầu trước.

13

Bạn có thể sử dụng std::function cho việc này:

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

Hoặc đi hoàn toàn chung:

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

này hoạt động trong 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

điều này dường như không hoạt động ... đầu ra tôi nhận được là hello _ – subzero

0

Chừng nào các lambda không sử dụng mệnh đề chụp (tức là không nắm bắt các biến từ trên nó), nó có thể được sử dụng như một con trỏ hàm. Trình biên dịch VC tạo nội bộ các hàm ẩn danh với quy ước gọi khác nhau để nó có thể được sử dụng mà không có vấn đề gì.

Các vấn đề liên quan