Generic Function Pointer

From C

Jump to: navigation, search
#include <stdio.h>

struct add_ctx {
    int a;
    int b;
    int c;
};

int add(int a, int b, int c) {
    return a + b + c;
}

typedef int add_func(int a, int b, int c);



struct sub_ctx {
    int a;
    int b;
};

int sub(int a, int b) {
    return a - b;
}

typedef int sub_func(int a, int b);



enum {
    ADD_FUNC,
    SUB_FUNC
};

typedef void void_f(void);

int call_function(int type, void_f *p, void *ctx_) {
    switch(type) {
        case ADD_FUNC: {
            add_func *add = (add_func *) p;
            struct add_ctx *ctx = ctx_;
            
            return add(ctx->a, ctx->b, ctx->c);
        }
        case SUB_FUNC: {
            sub_func *sub = (sub_func *) p;
            struct sub_ctx *ctx = ctx_;
            
            return sub(ctx->a, ctx->b);
        }
    }
    
    return 0;
}

int main(void) {
    int sum;
    
    struct add_ctx add_ctx = { 1, 2 , 3};
    sum = call_function(ADD_FUNC, (void_f *) &add, &add_ctx);
    printf("add: %d\n", sum);
    
    struct sub_ctx sub_ctx = { 1, 2};
    sum = call_function(SUB_FUNC, (void_f *) &sub, &sub_ctx);
    printf("sub: %d\n", sum);
    
    return 0;
}

.

Personal tools