C++如何实现接收tuple入参函数的My_func,支持多参数直接调用
C++ My_func函数实现修复方案
问题排查
你的现有代码存在两个核心错误:
- 入参格式不匹配:调用
My_func(f)("Hello", 8.5)时传入了两个独立参数,但目标函数f仅接收单个std::tuple类型入参,直接传参无法通过类型检查。 - 转发逻辑错误:内部lambda按值捕获了
f的副本,仍对其使用std::forward<F>,此时F对应外部入参的类型,和lambda内部捕获的f类型不匹配,转发行为不符合预期。
修复后代码
#include <tuple> #include <utility> template <class F> constexpr auto My_func(F&& f) { // 完美转发捕获可调用对象,适配左值、右值可调用对象场景 return [f = std::forward<F>(f)](auto&&... args) { // 将多个入参完美转发打包为tuple,匹配目标函数的入参要求 return f(std::forward_as_tuple(std::forward<decltype(args)>(args)...)); }; }
验证说明
修复后的代码可直接通过你给出的测试用例:
#include <string> #include <cassert> #include <tuple> auto f = [](const std::tuple<std::string, double>& t) { return std::get<0>(t); }; // 断言会正常通过 assert(My_func(f)("Hello", 8.5) == f({"Hello", 8.5}));
内容的提问来源于stack exchange,提问作者Art_Uspen
相关产品推荐
相关产品推荐

