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

C++如何编写可接收可变参数函数的My_func高阶函数

C++ 可接收函数、支持tuple解包调用的My_func实现

核心实现逻辑

你需要将传入的tuple参数解包,把所有元素作为实参转发给之前捕获的目标函数f,C++17及以上标准库提供的std::apply工具可以直接实现这个能力,不需要手动手写tuple展开逻辑。

补全后的完整代码

#include <tuple>
#include <utility>

template <class T>
auto My_func(T&& f) {
    return [f = std::forward<T>(f)](auto&& value) {
        // 补充以下代码即可实现要求的功能
        return std::apply(f, std::forward<decltype(value)>(value));
    };
}

代码说明

  • std::apply会自动把第二个tuple类型参数的所有元素展开,作为第一个可调用对象参数的入参完成调用
  • std::forward<decltype(value)>(value)是对传入的tuple做完美转发,保留其值类型(左值/右值),避免不必要的拷贝,保证参数传递的语义正确性
  • 该实现完全匹配示例要求:My_func(f)(std::make_tuple("Hello", 8.5))的调用结果和直接调用f("Hello", 8.5)完全一致

C14兼容实现(无法使用C17时可选)

如果编译环境只支持C++14,没有内置std::apply,可以手动通过索引序列展开tuple:

#include <tuple>
#include <utility>

template <class T>
auto My_func(T&& f) {
    return [f = std::forward<T>(f)](auto&& value) {
        constexpr auto tuple_size = std::tuple_size_v<std::decay_t<decltype(value)>>;
        return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
            return f(std::get<Is>(std::forward<decltype(value)>(value))...);
        }(std::make_index_sequence<tuple_size>{});
    };
}

内容的提问来源于stack exchange,提问作者Art_Uspen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:27:00