Interesting thread. This would be my try:

//-------------------------------------------------------------------------
// Some Prototypes
//-------------------------------------------------------------------------
void delegate(void); // Simple void function
#define CALL(this, func) delegate = this.aFunc; delegate()

void delegate1(int x); // Void function with int argument
#define CALL1(this, func, arg) delegate1 = this.aFunc; delegate1(arg)

int delegate2(int x); // Int function with int argument
#define CALL2(retVal, this, func, arg) delegate2 = this.aFunc; retVal = delegate2(arg)

// Expand this here ...

//-------------------------------------------------------------------------
// Some Functions
//-------------------------------------------------------------------------
void func1() // A simple void function
{
printf("Hallo world!");
}

void func2(int x) // A void function which process an argument
{
printf("Result = %d", x);
}

int func3(int x) // A function which process an argument and returns a result
{
return x * 2;
}

//-------------------------------------------------------------------------
// A structure with a function member
//-------------------------------------------------------------------------
typedef struct
{
int a,b;
long aFunc; // Simply use a long integer to store the function address
} AStruct;

//-------------------------------------------------------------------------
// Use it
//-------------------------------------------------------------------------
void main()
{
AStruct obj[3]; // 3 Instances

obj[0].aFunc = func1; // Obj 0 gets a simple void function
CALL(obj[0], aFunc);

obj[1].aFunc = func2; // Obj 1 gets a void function which process an argument
CALL1(obj[1], aFunc, 42);

obj[2].aFunc = func3; // Obj 2 gets a function which process an argument and returns a result
CALL2(int retVal, obj[2], aFunc, 42);
printf("retVal = %d", retVal);
}