ফাংশনগুলিতে পয়েন্টারগুলি সরল ডাটা পয়েন্টার নয় কারণ সেগুলি শূন্য * পয়েন্টারে সংরক্ষণ করা যায় না। তবুও, মনে হচ্ছে যে আমি নীচের কোডের মতো গতিশীল মেমোরিতে (জিসিসি এবং বিড়ম্বনায়) কোনও ফাংশন-পয়েন্টারটির অনুলিপি সঞ্চয় করতে পারি। এই জাতীয় কোডটি কি সি ++ স্ট্যান্ডার্ড অনুসারে আইনী, বা সম্ভবত এটি কোনও ধরণের সংকলক এক্সটেনশান?
তদ্ব্যতীত, ফাংশন-পয়েন্টারের ফলস্বরূপ পয়েন্টারটি একটি সরল ডেটা পয়েন্টার হিসাবে আচরণ করে: আমি এটিকে শূন্য * করে সংরক্ষণ করতে পারি এবং স্ট্যাটিক_কাস্ট দ্বারা এটি শূন্য * থেকে পুনরুদ্ধার করতে পারি। এই আচরণটি কি স্ট্যান্ডার্ড দ্বারা গ্যারান্টিযুক্ত?
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। এটি "পলিমারফিক" ফাংশনগুলি সংরক্ষণ করার ক্ষমতার জন্য দুর্দান্ত (যেমন সঠিক স্বাক্ষরযুক্ত কিছু, যদিও এটি কিছু ল্যাম্বডাসের মতো রাজ্যযুক্ত থাকে) তবে এটি ওভারহেড যোগ করে যা প্রয়োজন হয় না। একটি ফাংশনের পয়েন্টার হ'ল পিওডি। ক std::functionনা।
void*, সুতরাং এই প্রশ্নের প্রসঙ্গে std::functionমনে হচ্ছে তারা ঠিক কী খুঁজছিল। আমি সম্মত হই না যে ফাংশন পয়েন্টারগুলিকে এসপিডি-র সাধারণ বরখাস্ততা নিরবচ্ছিন্ন।
std::functionপরিবর্তে ব্যবহার করুন।