如何在 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::function
和 lambda-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);
};
};
};
};
}
我一直在尝试实现以下功能:
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::function
和 lambda-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);
};
};
};
};
}