फ़ंक्शन के पॉइंटर्स सादे डेटा पॉइंटर्स नहीं हैं क्योंकि वे एक शून्य * पॉइंटर में संग्रहीत नहीं किए जा सकते हैं। बहरहाल, ऐसा लगता है कि मैं नीचे दिए गए कोड की तरह फ़ंक्शन मेमोरी-पॉइंटर की कॉपी को डायनामिक मेमोरी (gcc और clang में) की तरह स्टोर कर सकता हूं। क्या ऐसा कोड C ++ मानक के अनुसार कानूनी है, या शायद यह किसी प्रकार का संकलक विस्तार है?
इसके अलावा, फ़ंक्शन-पॉइंटर में परिणामी सूचक एक सादे डेटा पॉइंटर के रूप में व्यवहार करता है: मैं इसे void * में संग्रहीत कर सकता हूं और इसे static_cast द्वारा void * से पुनर्प्राप्त कर सकता हूं। क्या यह व्यवहार मानक के अनुसार है?
int main()
{
extern void fcn();
void (*fcnPtr)() = &fcn;
void (**ptrToFcnPtr)() = nullptr;
//Make the copy of fcnPtr on the heap:
ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr);
//Call the pointed-to function :
(**ptrToFcnPtr)();
//Save the pointer in void* :
void *ptr = ptrToFcnPtr;
//retrieve the original ptr:
auto myPtr = static_cast< void(**)() > (ptr) ;
//free memory:
delete ptrToFcnPtr ;
}
newकास्ट करने की आवश्यकता नहीं है void*। void* ptr = &fcnPtr;सिर्फ एक काम करता है, क्योंकि fcnPtrएक वस्तु है, एक फ़ंक्शन नहीं है।
std::functionएक प्रकार का मिटाया हुआ कंटेनर है जो मनमाने ढंग से कॉल करने योग्य है, वास्तव में फ़ंक्शन पॉइंटर्स के लिए प्रतिस्थापन नहीं ...
std::function । यह "पॉलीमॉर्फिक" फ़ंक्शंस को स्टोर करने की अपनी क्षमता के लिए बहुत अच्छा है (यानी सही हस्ताक्षर के साथ कुछ भी, भले ही इसमें कुछ लैंबडास के मामले में राज्य हो), लेकिन यह भी उपरि जोड़ता है जिसकी आवश्यकता नहीं हो सकती है। किसी फ़ंक्शन का पॉइंटर POD है। ए std::functionनहीं है।
void*, इसलिए इस प्रश्न के संदर्भ में std::functionठीक वही लगता है जो वे खोज रहे थे। मैं इस बात से सहमत हूं कि फ़ंक्शन पॉइंटर्स की एसपीडी सामान्य बर्खास्तगी असत्य है।
std::functionइसके बजाय उपयोग करें ।