Wskaźniki do funkcji nie są zwykłymi wskaźnikami danych, ponieważ nie mogą być przechowywane w pustym wskaźniku *. Niemniej jednak wydaje się, że mogę przechowywać kopię wskaźnika funkcji w pamięci dynamicznej (w gcc i clang), jak w poniższym kodzie. Czy taki kod jest zgodny ze standardem C ++, a może jest to jakieś rozszerzenie kompilatora?
Ponadto wynikowy wskaźnik do wskaźnika funkcji zachowuje się jak zwykły wskaźnik danych: mogę przechowywać go w void * i odzyskać z void * przez static_cast. Czy takie zachowanie jest gwarantowane przez standard?
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 ;
}
newrzucić na void*. void* ptr = &fcnPtr;działa równie dobrze, ponieważ fcnPtrjest przedmiotem, a nie funkcją.
std::functionto skasowany typ kontenera do przechowywania dowolnych wywołań, w rzeczywistości nie zastępujący wskaźników funkcji ...
std::function. Jest świetny ze względu na możliwość przechowywania funkcji „polimorficznych” (tj. Cokolwiek z odpowiednią sygnaturą, nawet jeśli zawiera stan jak w przypadku niektórych lambdów), ale to także powoduje dodatkowe obciążenie, które może nie być potrzebne. Wskaźnik do funkcji to POD. A std::functionnie jest.
void*tekstu, więc w kontekście tego pytania std::functionwydaje się dokładnie tym, czego szukali. Zgadzam się, że ogólne odrzucenie wskaźników funkcji przez SPD jest nieuzasadnione.
std::functionzamiast tego.