【问题标题】:Is there a way to make a function return a function? [duplicate]有没有办法让函数返回一个函数? [复制]
【发布时间】:2019-05-21 18:11:21
【问题描述】:

所以在 Lua 中你可以做这样的事情

local function start(n)
    return function()
        n = n + 1;
        return n;
    end;
end

print(start(1)()); --> 2

我听说过模板,但我不想遇到 xy 问题,或者有其他方法

【问题讨论】:

  • 它们被称为Function objects 或函子。它只是提供operator() 的任何对象。
  • 返回std::function 或函数指针。
  • C++ 中的闭包有一些限制,这是由于缺少自动内存管理造成的。所以,你不会得到 100% 等价的东西。
  • 返回函数指针也可以解决
  • @JörgWMittag 想澄清一下您所说的自动内存管理是什么意思?例如,C++ 当然不缺少自动存储持续时间。

标签: c++


【解决方案1】:

在 C++ 中,您不能在另一个函数中声明一个函数。幸运的是,我们可以通过使用lambda expression 创建一个闭包对象来解决这个问题。你的代码,适应那将成为

template <typename Integer>
auto start(Integer n)
{
    return [n]() mutable { return ++n; };
}

然后你会像这样使用它

std::cout << start(1)();

关于上述示例,有几点需要注意。一、n的抓包。由于闭包对象是在start的范围之外返回的,所以我们必须通过值来捕获它,否则闭包会有一个悬空引用。其次,在 lambda 表达式中使用mutable。那是因为默认情况下operator()const。这意味着您无法修改n。使用mutable 删除const 并允许修改n

【讨论】:

  • 用auto代替模板怎么样?它会起作用吗?
  • @Mayur 你的意思是像auto start(auto n) ...?不,那行不通,至少现在不行。不过,它可能会添加到未来的 C++ 版本中。
  • 哦,那会很酷。
  • @Ayxan 是的。固定。
  • @Mayur 它将返回1 并将n 设置为2++nn 设置为 2 并返回 2
【解决方案2】:

最简单的方法是返回一个 lambda 函数对象:

auto start(int n) {
    return [n]() mutable {
        n = n + 1;
        return n;
    };
}

【讨论】:

  • 为什么要mutable
  • @Mayur 否则 n 在 lambda 中将是只读的。
猜你喜欢
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2013-10-30
  • 1970-01-01
相关资源
最近更新 更多