有没有办法在C中执行类似std :: bind的操作?

时间:2015-04-25 17:05:01

标签: c function function-pointers

所以我有一个void (*actionOnM)( void * myTypeInstance)类型的函数,我需要将其包装成void (*action)()并传递。这样的事情可能在C?

2 个答案:

答案 0 :(得分:3)

您通常可以使用以下规则在C语言中翻译(简单)C ++:

  • C ++类在C中成为仅包含属性(无方法)的结构
  • C ++方法是C函数,它将指向对象的指针(此处为struct)作为第一个参数

此处您的数据是:

  • 指向函数的指针,该函数采用void *参数并返回void
  • 指向参数的指针

但是你不会将它作为指向函数的指针传递,而是作为指向结构的指针:

typedef struct _binder {
    void (*action)(void *param);
    void *param;
} binder;

如果您想绑定 actionOnM(&myTypeInstance),您只需执行以下操作:

binder *bind = malloc(sizeof(binder));
bind->action = &actionOnM;
bind->param = &myTypeInstance;

然后,您可以将绑定函数作为单个参数bind传递:

void otherFunct(binder *bind, int otherParam) {
    /* ... */
    bind->action(bind->param); /* actual call to bound function */
    /* ... */
}

以及后来当然free(bind): - )

如果您希望所有这些更接近C ++方式,只需定义执行程序函数:

void bind_call(binder *bind) {
    bind->action(bind->param);
}

其他功能将成为:

void otherFunct(binder *bind, int otherParam) {
    /* ... */
    bind_call(bind); /* actual call to bound function */
    /* ... */
}

答案 1 :(得分:1)

你可以有一个包装函数,然后传递一个默认参数,大概是NULL,如

void action()
{
    actionOnM(NULL);
}

我相信c ++,如果你设置actionOnM()的默认参数,它就可以工作,所以这就模仿了。