使用联合和函数指针在 C 中实现函数委托

Phi*_*rad 5 c delegates function-pointers anonymous-function unions

我希望能够将一个函数一般地传递​​给C 中的一个函数。我已经使用 C 几年了,我知道实现正确的闭包和高阶函数的障碍。这几乎是不可逾越的。

我搜索了 StackOverflow 以查看其他消息来源对此事的看法:

...除了使用可变参数或程序集之外,没有人有一个银弹一般的答案。我没有汇编的骨头,但如果我能在宿主语言中有效地实现一个特性,我通常会尝试。

因为我不能轻易拥有 HOF...

我喜欢高阶函数,但我会在紧要关头满足于委托。我怀疑通过类似下面的代码,我可以在 C 中获得一个可行的委托实现

想到了这样的实现:

enum FUN_TYPES {
    GENERIC,
    VOID_FUN,
    INT_FUN,
    UINT32_FUN,
    FLOAT_FUN,
};

typedef struct delegate {
    uint32 fun_type;
    union function {
        int (*int_fun)(int);
        uint32 (*uint_fun)(uint);
        float (*float_fun)(float);
        /* ... etc. until all basic types/structs in the 
           program are accounted for. */
    } function;
} delegate;
Run Code Online (Sandbox Code Playgroud)

用法示例:

void mapint(struct fun f, int arr[20]) {
    int i = 0;
    if(f.fun_type == INT_FUN) {
        for(; i < 20; i++) {
            arr[i] = f.function.int_fun(arr[i]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


不幸的是,这种处理委托的方法有一些明显的缺点:

  • 没有类型检查,通过检查“fun_type”字段保存你自己做的那些。
  • 类型检查在您的代码中引入了额外的条件,使其比以前更加混乱和分支。
  • 函数的(安全)可能排列的数量受“fun_type”变量大小的限制。
  • 函数指针定义的枚举和列表必须由机器生成。除了微不足道的情况外,任何其他事情都接近于精神错乱。
  • 遗憾的是,通过普通的 C 并不像mov -> 调用序列那样有效,这可能在汇编中完成(有一些困难)。


有没有人知道在 C 中做委托之类的更好的方法?

注:越便携、越高效越好

另外,注意:我听说过Don Clugston对 C++ 的快速委托。但是,我对 C++ 解决方案不感兴趣——只是 C 。

Ant*_*ony 2

您可以void*向所有函数添加一个参数,以允许绑定参数、委托等。不幸的是,您需要为处理外部函数和函数指针的任何内容编写包装器。