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
相关产品推荐
相关产品推荐

