ตัวชี้ไปยังฟังก์ชันไม่ใช่ตัวชี้ข้อมูลธรรมดาเนื่องจากไม่สามารถเก็บไว้ในตัวชี้โมฆะ * อย่างไรก็ตามดูเหมือนว่าฉันสามารถเก็บสำเนาของตัวชี้ฟังก์ชั่นในหน่วยความจำแบบไดนามิก (ใน gcc และเสียงดังกราว) เช่นในรหัสด้านล่าง รหัสดังกล่าวถูกกฎหมายตามมาตรฐาน C ++ หรืออาจเป็นส่วนขยายคอมไพเลอร์บางส่วนหรือไม่
ยิ่งไปกว่านั้นตัวชี้ผลลัพธ์ไปยังฟังก์ชันตัวชี้ทำงานเป็นตัวชี้ข้อมูลธรรมดา: ฉันสามารถเก็บไว้ในโมฆะ * และดึงจากโมฆะ * โดย static_cast พฤติกรรมนี้รับประกันโดยมาตรฐานหรือไม่
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เป็นคอนเทนเนอร์ที่ลบประเภทสำหรับการจัดเก็บ callable โดยพลการไม่ได้แทนตัวชี้ฟังก์ชั่นจริง ๆ ...
std::functionกรุณาอย่าสุ่มสี่สุ่มห้าใช้ มันยอดเยี่ยมมากสำหรับความสามารถในการจัดเก็บฟังก์ชัน "polymorphic" (เช่นอะไรก็ตามที่มีลายเซ็นที่ถูกต้องแม้ว่าจะมีสถานะเหมือนในกรณีของ lambdas) แต่ก็เพิ่มค่าใช้จ่ายที่ไม่จำเป็น ตัวชี้ไปยังฟังก์ชันคือ POD std::functionไม่
void*ดังนั้นในบริบทของคำถามนี้std::functionดูเหมือนจะเป็นสิ่งที่พวกเขากำลังมองหา ฉันยอมรับว่าการเลิกจ้างตัวชี้ฟังก์ชั่นทั่วไปของ SPD นั้นไม่ปลอดภัย
std::functionแทน