如何在 C++ 中实现 function(f)(x)(y, z)(g)(r)?

How to implement function(f)(x)(y, z)(g)(r) in C++?

我一直在尝试实现以下功能:

MonsterFunction(f)(x)(y,z)(g)(r);

其中f是一个接受三个参数的函数。 x, y, z 是传递给函数 f 的参数,所有参数都传递给函数 g 并且参数 r 也传递给函数 g并返回最终结果。

我已经成功实现了MonsterFunction(f)(x)(y,z),但是就是想不通如何实现上面的功能

这是我已经完成的代码:

std::function<std::function<int(int, int)>(int)> MonsterFunction(std::function<int(int, int, int)> f){
    return [f](int x1){
        return[f, x1](int y1, int z1){
            return f(x1, y1, z1);
        };
    };
}

请记住,我只想使用 std::functionlambda-closure functions 来完成此操作。

我真的做到了,经过一段时间的休息后我能够实现它。只要您仔细跟踪嵌套,这很容易。 这是我的最终代码:

std::function<std::function<std::function<std::function<int(int)>(int(int, int))>(int, int)>(int)> MonsterFunction(std::function<int(int, int, int)> f){
    return [f](int x1){
        return[f, x1](int y1, int z1){
            int result = f(x1, y1, z1);
            return [result](int g(int, int)){
                return[result,g](int r){
                    return g(result, r);
                };
            };
        };
    };
}

现在我可以像这样打电话了MonsterFunction(Sum)(5)(5,4)(Multiply)(4)

Edit

正如 Quentin 所建议的那样,使用 auto 作为 return 类型可以使函数更加简洁:

auto MonsterFunction(std::function<int(int, int, int)> f){
    return [f](int x1){
        return[f, x1](int y1, int z1){
            int result = f(x1, y1, z1);
            return [result](int g(int, int)){
                return[result,g](int r){
                    return g(result, r);
                };
            };
        };
    };
}