2016-03-18 5 views
9

कुछ निम्नलिखित की तरह:क्या मैं std :: function type की ऑब्जेक्ट पर इशारा करते हुए एक फ़ंक्शन पॉइंटर परिभाषित कर सकता हूं?

#include <functional> 

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

त्रुटियों मैं

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 

लैम्ब्डा समारोह से जाने के लिए सूचक कार्य करने के लिए के रूप में अच्छी तरह से पता करने के लिए उपयोगी होगा एक और अधिक प्रत्यक्ष तरीका है।

+1

आप एसटीडी की ज़रूरत है है: : फ़ंक्शन या आप बस एक (कैप्चर-कम) लैम्ब्डा को फ़ंक्शन पॉइंटर प्राप्त करने का प्रयास कर रहे हैं? – Mat

+2

सं। फ़ंक्शन पॉइंटर्स फ़ंक्शंस को इंगित करते हैं, न कि उन कार्यों की तरह जो कार्य करते हैं। – Galik

+0

@ मूल रूप से मुझे कैप्चर-कम लैम्ब्डा में दिलचस्पी थी। मुझे यकीन नहीं है कि अगर लैम्ब्डा फ़ंक्शन एक रैल्यू बनाने पॉइंटर्स की तरह व्यवहार करेंगे असंभव। – roro

उत्तर

19
int* Fptr(int) 

एक समारोह "Fptr" है कि एक int लेता है और int* रिटर्न की घोषणा की।

एक समारोह सूचक घोषणा लगता है कि

int (*Fptr)(int) 

इसके अलावा, std::function<int(int)> नहीं अपने लैम्ब्डा समारोह के प्रकार है, लेकिन अपने लैम्ब्डा समारोह परोक्ष उस प्रकार के लिए परिवर्तित किया जा सकता है।

सौभाग्य से, एक (गैर कैप्चरिंग) लैम्ब्डा समारोह भी परोक्ष एक समारोह सूचक में बदला जा सकता है, तो लैम्ब्डा समारोह से सबसे सीधा तरीका सूचक कार्य करने के लिए

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

वाह, इस तथ्य के लिए +1 कि एक गैर-कैप्चरिंग लैम्ब्डा को फ़ंक्शन पॉइंटर के रूप में माना जा सकता है, जानना अच्छा है। – skypjack

संबंधित मुद्दे