Con trỏ tới các hàm không phải là con trỏ dữ liệu đơn giản vì chúng không thể được lưu trữ trong một con trỏ void *. Tuy nhiên, dường như tôi có thể lưu trữ bản sao của một con trỏ hàm trong bộ nhớ động (trong gcc và clang) như trong mã dưới đây. Là một mã như vậy hợp pháp theo Tiêu chuẩn C ++, hoặc có thể đây là một loại phần mở rộng trình biên dịch?
Hơn nữa, con trỏ kết quả đến con trỏ hàm hoạt động như một con trỏ dữ liệu đơn giản: Tôi có thể lưu trữ nó trong void * và truy xuất nó từ void * bởi static_cast. Là hành vi này được đảm bảo bởi Tiêu chuẩn?
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 ;
}
newchọn void*. void* ptr = &fcnPtr;cũng hoạt động tốt, vì fcnPtrlà một đối tượng, không phải là một chức năng.
std::functionlà một thùng chứa loại để lưu trữ một cuộc gọi tùy ý, không thực sự thay thế cho các con trỏ hàm chức năng
std::function. Thật tuyệt vời vì khả năng lưu trữ các chức năng "đa hình" (nghĩa là bất cứ thứ gì có chữ ký phù hợp, ngay cả khi nó có trạng thái như trong trường hợp của một số lambdas), nhưng điều đó cũng bổ sung thêm chi phí có thể không cần thiết. Một con trỏ tới một hàm là POD. A std::functionthì không.
void*, vì vậy trong bối cảnh của câu hỏi này std::functiondường như chính xác là những gì họ đang tìm kiếm. Tôi đồng ý rằng việc sa thải chức năng chung của SPD là không có cơ sở.
std::functionthay thế.