2016-03-18 17 views
9

Something như sau:Tôi có thể định nghĩa một con trỏ hàm trỏ đến một đối tượng của std :: function type không?

#include <functional> 

int main() 
{ 
    std::function<int(int)> func = [](int x){return x;}; 
    int* Fptr(int) = &func; //error 
} 

Các lỗi tôi nhận được

temp.cpp: In function ‘int main()’: 
temp.cpp:6:15: warning: declaration of ‘int* Fptr(int)’ has ‘extern’ and is initialized 
    int* Fptr(int) = &func; //error 
      ^
temp.cpp:6:20: error: invalid pure specifier (only ‘= 0’ is allowed) before ‘func’ 
    int* Fptr(int) = &func; //error 
        ^
temp.cpp:6:20: error: function ‘int* Fptr(int)’ is initialized like a variable 

Một cách trực tiếp hơn để đi từ hàm lambda thực hiện chức năng con trỏ sẽ hữu ích để biết là tốt.

+1

Bạn có cần các tiêu chuẩn: : chức năng hoặc là bạn chỉ cần cố gắng để có được một con trỏ hàm đến một lambda (capture-less)? – Mat

+2

Không. Con trỏ hàm trỏ đến các hàm, không phải các đối tượng hoạt động như các hàm. – Galik

+0

@Mat ban đầu tôi đã quan tâm đến lambda chụp ít. Tôi không chắc liệu các hàm lambda có hoạt động như một con trỏ làm giá trị không. – roro

Trả lời

19
int* Fptr(int) 

tuyên bố chức năng "Fptr" mất int và trả về int*.

Một tuyên bố con trỏ hàm trông giống như

int (*Fptr)(int) 

Hơn nữa, std::function<int(int)> không phải là loại chức năng lambda của bạn, nhưng chức năng lambda của bạn có thể được ngầm chuyển đổi sang loại đó.

May mắn thay, một (không chụp) chức năng lambda có thể cũng được ngầm chuyển đổi sang một con trỏ hàm, vì vậy cách trực tiếp nhất từ ​​hàm lambda thực hiện chức năng con trỏ là

int (*Fptr)(int) = [](int x){return x;}; 
+2

Wow, +1 cho thực tế là một lambda không bắt giữ có thể được coi là một con trỏ hàm, tốt đẹp để biết. – skypjack

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