首页 > 解决方案 > 有没有办法让函数返回一个函数?

问题描述

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

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

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

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

标签: c++

解决方案


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

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

然后你会像这样使用它

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

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


推荐阅读