typedef int (*GenericFn)(); // matches x86 FARPROC, minus explicit calling convention
typedef bool (*DesiredFn)(int,int);
DesiredFn target = nullptr;
void* temp = static_cast<void*>(&target); // pointer to function pointer
Здесь нет ничего плохого, но приведение не нужно. Указатель на любой объект (указатель на функцию является объектом) может быть преобразован в указатель на void
без приведения. например,
void* temp = ⌖
GenericFn* address = static_cast<GenericFn*>(temp);
Вы можете преобразовать указатель в void
в указатель на любой тип объекта, но результаты будут определены, только если вы приведете значение, преобразованное в void*
, к исходному типу, из которого оно было преобразовано. Технически, только static_cast<DesiredFn*>(temp)
будет иметь четко определенный результат.
*address = GetProcAddress(module, "MyFunction"); // supposedly valid?
Это технически неверно, поскольку вы солгали о типе значения, которое вы присвоили address
, поэтому address
не указывает на объект, который соответствует его информации о типе.
Сказав все это, во многих реализациях все указатели функций представлены одинаково, и любое приведение и преобразования не влияют на значение, которое фактически сохраняется. Пока вы вызываете функцию через указатель, который фактически соответствует типу указателя, у вас не будет никаких проблем.
В конце концов, вы должны полагаться на поведение вашей реализации reinterpret_cast
и GetProcAddress
, чтобы оригинальный метод вообще работал, но - как вы говорите - я бы рекомендовал придерживаться подхода reinterpret_cast
в этом случае как понятно, что происходит.