You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何嵌套组合多个函数?能否用模板参数包实现?

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:55:29