Мне очень жаль за потенциально сложный и запутанный заголовок, но прежде чем пытаться уничтожить английский язык, я просто добавлю то, что я смотрю, в код C ++.
//The parent struct
struct Parameters
{
};
//the derived struct
struct ParametersDerived : public Paramters
{
//Paramters
int paramData;
//return values
int retData;
};
//the function i am passing the function pointer to
void Function(void(*FunctionPointer)(Parameters*));
//the function pointer i am passing to the function
void FunctionToPass(ParametersDerived* param)
{
//TODO: do stuff here
}
//Call the function with the function pointer
Function(FunctionToPass);
Это серьезно смущает меня, потому что мне нужно передать указатель на функцию, но параметры указанного указателя функции будут разными. Я буду передавать несколько различных указателей на функции, потому что она хранит список указателей на функции. Каждый из указателей на функцию имеет уникальный идентификатор, который используется для вызова функции, затем через него передаются параметры, например, void CallFunction(unsigned int FuncId, Parameters* param)
, Это не точная система, потому что она проприетарна, но использует ту же концепцию. Для всех интенсивных целей функции ВСЕ глобальны. Кроме того, я хотел бы сохранить систему, которую пытаюсь создать, но если бы у меня было что-то похожее, что было бы лучше, я был бы рад принять его.
Вы можете изменить функции, чтобы взять void *
в качестве аргумента.
//the function i am passing the function pointer to
void Function(void(*FunctionPointer)(void*));
//the function pointer i am passing to the function
void FunctionToPass(void* voidparam)
{
ParametersDerived* param = (ParametersDerived*)voidparam;
//TODO: do stuff here
}
Конечно, это очень важно, чтобы в функции были переданы правильные параметры, потому что компилятор больше не может проверять безопасность типов.
ОТВЕТЬТЕ ЗДЕСЬ
Я только что заметил ваш комментарий, чтобы обеспечить безопасность типов (при условии, что вы действительно хотите сохранить подход «указатель на функцию»), вы можете добавить элемент в структуру базовых параметров, например int ParameterType
и проверьте это в вызываемых функциях.
//The parent struct
struct Parameters
{
int ParameterType;
};