有没有办法让一个函数返回一个函数?

时间:2019-05-21 18:11:22

标签: c++

因此在Lua中,您可以执行以下操作

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

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

我听说过模板,但是我不想遇到xy问题,或者还有另一种方法

2 个答案:

答案 0 :(得分:6)

在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

答案 1 :(得分:4)

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

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