函数指针不是纯数据指针,因为它们不能存储在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是一个对象,而不是一个函数。
@Someprogrammerdude
—
Michael Kenzel
std::function是一个类型擦除的容器,用于存储任意可调用的对象,而不是功能指针的真正替代对象……
(@Someprogrammerdude)请不要盲目使用/推荐
—
马修
std::function。它具有存储“多态”函数的能力(即,具有正确签名的任何东西,即使它包含某些lambda的状态,也是如此),但它也增加了不必要的开销。指向函数的指针是POD。A std::function不是。
@Matthew公平地说,Adrian询问动态分配给函数的指针并使用类型擦除来指向它
—
eerorika
void*,因此在这个问题的上下文中,这std::function似乎正是他们想要的。我确实同意SPD对函数指针的一般解雇是不合理的。
std::function代替。