【问题标题】:Writing a functor in C用 C 编写函子
【发布时间】:2016-09-29 15:34:36
【问题描述】:

我想在 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
}

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

【问题讨论】:

  • C 不支持闭包,这是不可行的,如果您需要使用 () 运算符调用它,则不支持。
  • 嵌套函数不是标准的 C.
  • 什么是模拟它的最佳方式(如果有的话)?
  • 函子是什么形式的?
  • @naomik 我去了这个:stackoverflow.com/a/356993/1350864

标签: c function functional-programming functor


【解决方案1】:

不,这是不可能的,因为内存中没有任何地方可以以&add 引用它的方式存储int aint a 存在于make_adder 的函数栈上并且不存在,所以&add 不能指代原版。制作 int a 的副本是不可能的,因为该副本的生命周期需要与 &add 的生命周期相关联,而 C 没有必要的垃圾回收。

因此,总而言之,我们既不能保存原始堆栈变量a,也不能在堆上复制。

【讨论】:

  • 谢谢。但是这段代码应该代表我想做的事情,而不是我将如何去实现它。我可以以任何其他方式在 C 中实现函子/闭包,或者至少模拟这种行为吗?
  • @andrepd:当然你可以自己提供存储空间:struct closure{ int a; int (*fun)(int, int); }int call(struct closure*, int x)
  • 嗯,有道理!我想我太依赖于我忽略了显而易见的 function() 语法。在 C++ 中,我可以做到这一点并重载 operator(),但在这里我猜是这样做的 ;)
猜你喜欢
  • 2011-03-15
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2020-06-03
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多