【问题标题】:Is there any way to perform something alike std::bind in C?有什么方法可以在 C 中执行类似 std::bind 的操作吗?
【发布时间】:2015-04-25 17:05:01
【问题描述】:

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

【问题讨论】:

  • 你有什么问题?
  • 能够在运行时获得指向 actionOnM(data1) ... actionOnM(dataN) 的指针(指针看起来像 void (*action)() )。

标签: c function function-pointers


【解决方案1】:

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

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

你的数据在这里:

  • 一个指向函数的指针,该函数采用 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 */
    /* ... */
}

【讨论】:

    【解决方案2】:

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

    void action()
    {
        actionOnM(NULL);
    }
    

    我相信如果你为actionOnM() 设置一个默认参数,C++ 就可以工作,所以它模拟了这一点。

    【讨论】:

    • 主要思想是能够将变量绑定到函数指针中(不是NULL,而是任何给定的,如果可能的话不在编译时指针定义)
    • @DuckQuen 这在 c 中是不可能的,因为在 c++ 中,std::bind 类可能会在某个地方存储指针,然后在调用它时将其传递给函数,但你不能在 c 中这样做,你能提供一些背景信息吗?谁将函数指针作为参数?
    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多