如何嵌套组合多个函数?能否用模板参数包实现?
用C++模板参数包实现函数嵌套组合
当然可以用模板参数包实现这种函数嵌套组合的需求,下面是具体的实现方案:
核心实现(适配无参最内层函数)
利用C++的可变模板参数和递归展开特性,从最内层函数开始逐层向外嵌套调用,最终生成组合后的函数对象:
#include <functional> // 终止条件:仅剩余最后一个无参函数时,返回执行该函数的lambda template<typename Func> auto some_nest_method(Func&& func) { return [func = std::forward<Func>(func)]() { return func(); }; } // 递归展开参数包:将当前函数与后续组合后的嵌套函数绑定 template<typename FirstFunc, typename... RestFuncs> auto some_nest_method(FirstFunc&& first, RestFuncs&&... rest) { auto nested_func = some_nest_method(std::forward<RestFuncs>(rest)...); return [first = std::forward<FirstFunc>(first), nested_func]() { return first(nested_func()); }; }
扩展:支持最内层函数带参数
如果后续需要最内层函数接受输入参数,只需修改终止模板,让它直接转发函数本身,递归逻辑传递参数即可:
#include <functional> // 终止条件:剩余单个函数时直接返回(支持带参) template<typename Func> auto some_nest_method(Func&& func) { return std::forward<Func>(func); } // 递归组合:将参数传递给内层嵌套函数 template<typename FirstFunc, typename... RestFuncs> auto some_nest_method(FirstFunc&& first, RestFuncs&&... rest) { auto nested_func = some_nest_method(std::forward<RestFuncs>(rest)...); return [first = std::forward<FirstFunc>(first), nested_func](auto&& x) { return first(nested_func(std::forward<decltype(x)>(x))); }; }
使用示例
#include <iostream> // 测试函数 int h() { return 42; } int g(int val) { return val * 2; } int f(int val) { return val + 10; } // 带参数的内层函数示例 int h_with_param(int x) { return x + 5; } int main() { // 无参内层函数场景 auto combined = some_nest_method(f, g, h); std::cout << combined() << std::endl; // 输出 94,等价于 f(g(h())) // 带参数内层函数场景 auto combined_with_param = some_nest_method(f, g, h_with_param); std::cout << combined_with_param(10) << std::endl; // 输出 (10+5)*2+10=40,等价于 f(g(h_with_param(10))) return 0; }
实现说明
- 递归展开:每次从参数包中取出第一个函数,将剩余函数递归组合成内层调用逻辑,最终实现
f(g(h(...)))的嵌套结构。 - 完美转发:使用
std::forward保证函数对象的引用类型被正确传递,避免不必要的拷贝或移动开销。 - lambda捕获:通过值捕获(或移动捕获)保存函数对象,确保组合后的函数对象可以独立调用。
内容的提问来源于stack exchange,提问作者zclll
相关产品推荐
相关产品推荐

