【问题标题】:C++ Lambdas: function that returns a function that returns a function ...?C ++ Lambdas:返回函数的函数返回函数......?
【发布时间】:2015-10-31 20:46:19
【问题描述】:

C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。 例如

std::function<...> func = ...;
do
{
    func = func();
}
while (func);

在 C 中,我认为您可以使用将 void* 转换为 void* (*)() 来实现它。 所以你会有

typedef void* (*MyFunc)(void);
MyFunc func = ...
do
{
    func = (MyFunc)func();
}
while(func);

可以用 lambdas 实现吗?

【问题讨论】:

  • 您的 C 示例不可移植,标准 C 不允许将函数指针转换为其他类型的指针。
  • @Olaf,问题不是“我可以用 C 中的 lambdas 做到这一点吗?”它是“我可以用 C++ 中的 lambdas 做到这一点吗?”所以 C 是否支持 lambdas 无关紧要。
  • 这是一个相当模糊的提示。
  • @JonathanWakely 它是。
  • 这是turtles all the way down 的事情吗?

标签: c++ c lambda functional-programming


【解决方案1】:

您的 C 示例不是有效的 ISO C。它可以在 C++ 中使用在 C 中也有效的功能来完成:

typedef void (*func_type)();
typedef func_type (*func_func_type)();

int i = 5;
func_type f() { return --i ? (func_type)f : 0; }

int main()
{
  func_func_type func = f;
  do
  {
    func = (func_func_type)func();
  }
  while(func);
}

您不能重写它来直接使用 lambda,因为 lambda 不能引用自身(就像 f 那样),但是您可以将 lambda 转换为函数指针,保留从一种函数指针类型到另一个,并将其存储在 std::function 中,如下所示:

#include <functional>

typedef void (*func_type)();
typedef func_type (*func_func_type)();

int i = 5;
func_func_type f = (func_func_type)[]{ return --i ? (func_type)f : nullptr; };

int main()
{
  std::function<func_type()> func = f;
  do
  {
    func = (func_func_type)func();
  }
  while(func);
}

【讨论】:

  • 我知道它是无效的并且不能用于例如 AVR 拱门。然而,它会在我关心的架构上,比如 ARM 和 x86,并且很多代码和库使用 ist 就好了,例如参见 dlopen(3)。但是感谢您的示例,我认为这就是我所需要的。
  • 您的示例(将函数指针转换为 void 指针并再次返回)不可移植,但我的示例完全可以(将函数指针转换为不同的函数指针并再次返回)。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 2016-08-28
  • 2013-04-03
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2012-06-04
相关资源
最近更新 更多