함수에 대한 포인터는 void * 포인터에 저장할 수 없으므로 일반 데이터 포인터가 아닙니다. 그럼에도 불구하고 아래 코드와 같이 함수 포인터의 사본을 동적 메모리 (gcc 및 clang)에 저장할 수있는 것 같습니다. 이러한 코드는 C ++ 표준에 따라 합법적입니까, 아니면 일종의 컴파일러 확장입니까?
또한 함수 포인터에 대한 결과 포인터는 일반 데이터 포인터처럼 작동합니다. void *에 저장하고 static_cast에 의해 void *에서 검색 할 수 있습니다. 이 행동은 표준에 의해 보장됩니까?
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. "다형성 (polymorphic)"함수 (즉, 일부 람다의 경우와 같이 상태를 포함하더라도 올바른 서명을 가진 것)를 저장하는 기능에는 훌륭하지만, 필요하지 않은 오버 헤드도 추가합니다. 함수에 대한 포인터는 POD입니다. A std::function는 아닙니다.
void*질문의 맥락에서 std::function정확히 그들이 찾던 것 같습니다. SPD의 일반적인 함수 포인터 해제가 적절하지 않다는 데 동의합니다.
std::function대신 사용하십시오 .