İşlevlere işaretçiler, geçersiz işaretçi içinde saklanamayacakları için düz veri işaretçileri değildir. Yine de, bir fonksiyon işaretçisinin kopyasını aşağıdaki koddaki gibi dinamik bellekte (gcc ve clang olarak) saklayabildiğim görünüyor. C ++ Standardına göre böyle bir kod yasal mı, yoksa bu bir çeşit derleyici uzantısı mıdır?
Ayrıca, işlev işaretçisi için ortaya çıkan işaretçi düz bir veri işaretçisi gibi davranır: Ben void * depolamak ve static_cast tarafından void * alabilirsiniz. Bu davranış Standart tarafından garanti ediliyor mu?
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 ;
}
newetmek döküm için void*. bir işlev değil, bir nesne olduğu için void* ptr = &fcnPtr;de aynı şekilde çalışır fcnPtr.
std::function, isteğe bağlı olarak çağrılabilir depolamak için türden silinen bir kaptır, işlev işaretçileri için bir yedek değildir ...
std::function. "Polimorfik" fonksiyonları (yani, bazı lambdalarda olduğu gibi durum içeriyor olsa bile, doğru imzası olan herhangi bir şeyi) saklama kabiliyeti için mükemmeldir, ancak bu, gerekli olmayan ek yükü de ekler. Bir işleve işaretçi POD'dur. A std::functiondeğil.
void*, bu nedenle bu soru bağlamında std::functiontam olarak aradıkları gibi görünüyor. SPD'nin işlev işaretleyicilerinin genel olarak işten çıkarılmasının uygun olmadığını kabul ediyorum.
std::functionBunun yerine kullanın .