我希望能够将函数一般地传递给 C 中的函数。我已经使用 C 几年了,并且我知道实现正确的闭包和高阶函数的障碍。这几乎是不可逾越的。
我搜索了 StackOverflow 以了解其他消息来源对此事的看法:
- c 中的高阶函数
- 匿名函数使用 gcc 语句表达式
- 有没有一种方法可以在 C 中进行柯里化
- 函数式编程-c-issue-with-types
- 在 C 中模拟部分功能应用程序
- c 中的假匿名函数
- 带有宏高阶函数生成器的 c 函数式编程
- c 中的高阶函数作为句法糖,只需最少的努力
...除了使用可变参数或汇编之外,没有一个通用的答案。我对汇编没有骨气,但如果我能有效地用宿主语言实现一个特性,我通常会尝试。
因为我不能轻易拥有 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;
使用示例:
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]);
}
}
}
不幸的是,这种方法对代表有一些明显的缺点:
- 没有类型检查,通过检查“fun_type”字段保存你自己做的那些。
- 类型检查在你的代码中引入了额外的条件,使它比以前更加混乱和多变。
- 函数的(安全)可能排列的数量受“fun_type”变量的大小限制。
- 函数指针定义的枚举和列表必须是机器生成的。除了琐碎的情况外,其他任何事情都会接近精神错乱。
- 遗憾的是,通过普通的 C 语言并不像mov -> 调用序列那样有效,这可能在汇编中完成(有一些困难)。
有谁知道在 C 中做类似委托的更好方法?
注:越便携、越高效越好
另外,注意:我听说过Don Clugston 的 C++ 非常快的代表。但是,我对 C++ 解决方案不感兴趣——只是 C 。