在C中编写一个仿函数

and*_*epd 2 c functional-programming function functor

我想在C中做这样的事情:

typedef int (*func)(int);

func make_adder(int a) {
  int add(int x) {
    return a + x;
  }
  return &add;
}

int main() {
  func add_42 = make_adder(42);
  // add_42(10) == 52
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.它可行吗?我的错误在哪里?

MSa*_*ers 5

不,这是不可能的,因为在内存中没有任何地方int a可以以&add引用它的方式存储.int a存在于函数堆栈中make_adder并且不存在,因此&add不能指原始函数.制作副本int a是不可能的,因为该副本的生命周期需要与之相关&add,并且C没有必要的垃圾收集.

因此,总之,我们无法保存原始堆栈变量a或在堆上进行复制.

  • @andrepd:当然你可以自己提供存储:`struct closure {int a; int(*fun)(int,int); }`和`int call(struct closure*,int x)`. (3认同)