函数指针算法库

函数指针, 函数指针数组声明

typedef  int (*fun_t)(void*, ....)
typedef  int (*fun_t[])(void*, ...)

通过参数指定回调函数,代码示例

typedef int (*fun0_t)(void);
typedef int (*fun1_t)(int *);
typedef int (*fun2_t)(int *, int *);
typedef int (*fun3_t)(int *, int *, int *);
typedef int (*fun4_t)(int *, int *, int *, int *);
typedef int (*fun5_t)(int *, int *, int *, int *, int *);
typedef int (*fun6_t)(int *, int *, int *, int *, int *, int *);
typedef int (*fun7_t)(int *, int *, int *, int *, int *, int *, int *);
typedef int (*fun8_t)(int *, int *, int *, int *, int *, int *, int *, int *);
typedef int (*fun9_t)(int *, int *, int *, int *, int *, int *, int *, int *, int *);
typedef int (*fun10_t)(int *, int *, int *, int *, int *, int *, int *, int *, int *, int *);

typedef int (*call_fun_t)(int *arg[], fun_t fun);

static int call_fun0(int *arg[], fun_t fun)
{
    fun0_t fun0;
    int rv;

    fun0 = (fun0_t)fun;
    rv = fun0();

    return rv;
}

static int call_fun1(int *arg[], fun_t fun)
{
    fun1_t fun1;
    int rv;

    fun1 = (fun1_t)fun;
    rv = fun1(arg[0]);

    return rv;
}

static int call_fun2(int *arg[], fun_t fun)
{
    fun2_t fun2;
    int rv;

    fun2 = (fun2_t)fun;
    rv = fun2(arg[0], arg[1]);

    return rv;
}

static int call_fun3(int *arg[], fun_t fun)
{
    fun3_t fun3;
    int rv;

    fun3 = (fun3_t)fun;
    rv = fun3(arg[0], arg[1], arg[2]);

    return rv;
}

static int call_fun4(int *arg[], fun_t fun)
{
    fun4_t fun4;
    int rv;

    fun4 = (fun4_t)fun;
    rv = fun4(arg[0], arg[1], arg[2], arg[3]);

    return rv;
}

static int call_fun5(int *arg[], fun_t fun)
{
    fun5_t fun5;
    int rv;

    fun5 = (fun5_t)fun;
    rv = fun5(arg[0], arg[1], arg[2], arg[3], arg[4]);

    return rv;
}

static int call_fun6(int *arg[], fun_t fun)
{
    fun6_t fun6;
    int rv;

    fun6 = (fun6_t)fun;
    rv = fun6(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);

    return rv;
}

static int call_fun7(int *arg[], fun_t fun)
{
    fun7_t fun7;
    int rv;

    fun7 = (fun7_t)fun;
    rv = fun7(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6]);

    return rv;
}

static int call_fun8(int *arg[], fun_t fun)
{
    fun8_t fun8;
    int rv;

    fun8 = (fun8_t)fun;
    rv = fun8(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7]);

    return rv;
}

static int call_fun9(int *arg[], fun_t fun)
{
    fun9_t fun9;
    int rv;

    fun9 = (fun9_t)fun;
    rv = fun9(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8]);

    return rv;
}

static int call_fun10(int *arg[], fun_t fun)
{
    fun10_t fun10;
    int rv;

    fun10 = (fun10_t)fun;
    rv = fun10(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8], arg[9]);

    return rv;
}

static call_fun_t g_call[] = {
    call_fun0, call_fun1, call_fun2, call_fun3, call_fun4, call_fun5, call_fun6, call_fun7, call_fun8, call_fun9, call_fun10
};

int callfun(int argc, int * argv[], fun_t fun)
{
    int rv;

    rv = g_call[argc](argv, fun);
  
    return rv;
}

算法库代码说明

  • argc:参数个数
  • argv:回调函数的序列化参数列表
  • fun: 通过参数个数指定回调函数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容