Pointer ke fungsi bukan pointer data biasa karena tidak dapat disimpan dalam pointer * kosong. Meskipun demikian, tampaknya saya dapat menyimpan salinan fungsi-pointer dalam memori dinamis (dalam gcc dan dentang) seperti pada kode di bawah ini. Apakah kode tersebut legal menurut Standar C ++, atau mungkin ini semacam ekstensi kompiler?
Selain itu, pointer yang dihasilkan ke function-pointer berperilaku sebagai pointer data biasa: Saya dapat menyimpannya di void * dan mengambilnya dari void * oleh static_cast. Apakah perilaku ini dijamin oleh Standar?
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 ;
}
newdilemparkan void*. void* ptr = &fcnPtr;berfungsi dengan baik, karena fcnPtrmerupakan objek, bukan fungsi.
std::functionadalah wadah tipe-terhapus untuk menyimpan callable sewenang-wenang, bukan pengganti pengganti fungsi pointer ...
std::function. Ini bagus untuk kemampuannya menyimpan fungsi "polimorfik" (yaitu apa saja dengan tanda tangan yang benar, bahkan jika itu berisi keadaan seperti dalam kasus beberapa lambda), tetapi itu juga menambahkan overhead yang mungkin tidak diperlukan. Pointer ke fungsi adalah POD. A std::functionbukan.
void*, jadi dalam konteks pertanyaan ini std::functiontampaknya persis apa yang mereka cari. Saya setuju bahwa pemecatan umum pointer fungsi SPD tidak sehat.
std::functionsebagai gantinya.